プログラム引数を分離する方法を決定するには?

プログラム引数を分離する方法を決定するには?

killユーティリティが空白文字と改行文字で区切られた引数を受け入れることができることを確認しました。

$ sleep 120 & sleep 240 &
[1] 75341
[2] 75342
$ /bin/kill $(echo "75341 75342")
[1]-  Terminated: 15          sleep 120
[2]+  Terminated: 15          sleep 240
$ sleep 120 & sleep 240 &
[1] 75577
[2] 75578
$ /bin/kill $(echo -e "75577\n75578")
[1]-  Terminated: 15          sleep 120
[2]+  Terminated: 15          sleep 240
$ 

たとえば、改行で区切られたパラメータを許可した場合、ユーティリティ自体によって異なりますか?

ベストアンサー1

引用しなかったので、$(echo -e "75577\n75578")これを処理することはシェルに依存します。

シェルが取得した内容を解析する方法は、内部フィールド区切り記号(IFS)という変数によって異なります。デフォルトでは、スペース、タブ、改行文字が含まれています。つまり、これら3文字の組み合わせは、引数間の有効な区切り文字と見なされます。

改行を含まない文字列に設定すると、コマンドを\n含むパラメータを受け取り、失敗します。

$ touch a b
$ echo "$IFS" | od -c
0000000      \t  \n  \n
0000004$ 
$ ls -l a b
-rw-r--r-- 1 jlliagre jlliagre 0 Nov 12 15:04 a
-rw-r--r-- 1 jlliagre jlliagre 0 Nov 12 15:04 b
$ ls -l $(printf "a\nb")
-rw-r--r-- 1 jlliagre jlliagre 0 Nov 12 15:05 a
-rw-r--r-- 1 jlliagre jlliagre 0 Nov 12 15:05 b
$ IFS=" "
$ ls -l $(printf "a\nb")
ls: cannot access a
b: No such file or directory
$

おすすめ記事