Perl:system()呼び出しのシェルシンボルの解釈が変更されましたか?

Perl:system()呼び出しのシェルシンボルの解釈が変更されましたか?

今日、私はおそらく最近、Perlでシェルコマンドを実行する方法にいくつかの変更があることを発見しました。何が変わったのか説明できる人はいますか?私自身も答えを見つけることができず、悲しいことに私たちはこの変化について最も難しい方法で学びました。一部の新規ユーザーは、新しいホームディレクトリから興味深いコンテンツを手に入れました。

簡単なコマンド/スクリプトを実行しています。

#!/usr/bin/perl -w

system("ls -R /etc/skel/.[^.]*");

Debian 11では、perl v5.32.1出力は次のようになります/etc/skel(予想通り)。

.  ..  .bash_logout  .bashrc  .face  .face.icon  .kshrc  .profile

しかし、Debian 12ではperl v5.36.0ワイルドカードを無視して^全体を読みます。/etc..無視されないという意味だ

^代替記号に変更した場合!system("ls -R /etc/skel/.[!.]*");期待どおりに再び機能しました。

問題は、Perlのシンボルと呼び出しの処理!に何が起こったのかということです。^system()

編集者:2023年9月29日19時50分

両方のサーバーでいくつかのテストをしましたが、何かが変わったと思いますかdash

Debian 11: (dash Version: 0.5.11+git20200708+dd9ef66-5ダッシュにフラグが表示されないため、--versionAPTからインポートされます。)

root@s:~# dash -c 'ls -R /etc/skel/.[^.]*'
/etc/skel/.bash_logout  /etc/skel/.bashrc  /etc/skel/.forward+spam  /etc/skel/.kshrc  /etc/skel/.profile
root@s:~# dash -c 'ls -R /etc/skel/.[!.]*'
/etc/skel/.bash_logout  /etc/skel/.bashrc  /etc/skel/.forward+spam  /etc/skel/.kshrc  /etc/skel/.profile

Debian 12:dash Version: 0.5.12-2

[students] ~ ➽ $ dash -c 'ls -R /etc/skel/.[^.]*' | more
/etc/skel/..:
a2ps.cfg
a2ps-site.cfg
adduser.conf
adjtime
aliases
aliases.db
alsa
alternatives

[students] ~ ➽ $ dash -c 'ls -R /etc/skel/.[!.]*'
/etc/skel/.bash_logout  /etc/skel/.bashrc  /etc/skel/.face  /etc/skel/.face.icon  /etc/skel/.kshrc  /etc/skel/.profile

ありがとう、カミル

ベストアンサー1

変更はPerlではなく、システムのデフォルトシェルです。 Perlはsystem()useを呼び出します/bin/sh。最近のDebianとDebianの派生製品では、これはデフォルトのdashPOSIXシェルへのシンボリックリンクです。古いシステムとDebianではない多くのシステムではbash

実際、両方のシェルは異なる動作をします[^.]

$ dash -c 'ls -R /etc/skel/.[^.]*' 2>/dev/null | wc
   2875    2572   45543
$ bash -c 'ls -R /etc/skel/.[^.]*' 2>/dev/null | wc
      5       5     103

次の手順で簡単にテストできます。

$ cd /bin
$ sudo rm sh
$ sudo ln -s bash sh

その後、Perl スクリプトを再実行します。期待どおりに動作することがわかります。戻って変更をキャンセルすることを忘れないでください。

$ cd /bin
$ sudo rm sh
$ sudo ln -s dash sh

おすすめ記事