今日、私はおそらく最近、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
ダッシュにフラグが表示されないため、--version
APTからインポートされます。)
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の派生製品では、これはデフォルトのdash
POSIXシェルへのシンボリックリンクです。古いシステムと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