私は次のことを行います。
$ ./input ""
出力:
argc 2
argv[1][0] 0
ただし、プログラムベースの方法で(複数の)空の引用符を渡したい場合:
$ python -c 'print "\"\""'
""
./input $(python -c 'print "\"\""')
以下を提供します。
argc 2
argv[1][0] 22 - (22 hex value for ")
では、どうすれば次のようなものを生成できますか?
$ ./input "" "" "" ""
例1と同じ結果が得られますか?
ベストアンサー1
存在する
./input $(cmd)
$(cmd)
引用符で囲まないのは、分割+グローブ演算子であるからです。シェルによって取得された出力は、末尾の改行をcmd
すべて削除し、特殊引数の値$IFS
に従って分割し、生成された*.txt
単語(現在のディレクトリに隠されていないtxtファイルのリストなど)を使用してファイル名を生成します(なし後半)、zsh
の場合は中ksh
括弧の拡張(たとえば、a{b,c}
行ab
、および)も実行します。ac
デフォルトには$IFS
SPC、TAB、およびNL文字が含まれます(zsh
他のシェルはNULを削除または終了します)。これら(NULではない)はIFS空白文字でもあり、IFS分割中に特に処理されます。
Split+glob 演算子は、 の出力がで引数があればcmd
生成されます。 IFS空白文字の場合、1つ以上のIFS空白文字シーケンスが考慮されているため、空の引数を生成できません。" a b\nc \n"
"a"
"b"
"c"
./input
split+glob
一つ分離記号。空のパラメーターを生成するには、IFS 空白文字ではなく区切り文字を選択する必要があります。実際、空白以外の文字はすべて可能です(すべてのシェルがサポートしているわけではありませんが、マルチバイト文字を避けるのが最善です)。
たとえば、次のような場合:
IFS=: # split on ":" which is not an IFS-whitespace character
set -o noglob # disable globbing (also brace expansion in ksh)
./input $(cmd)
cmd
出力の場合、a::b\n
分割+glob演算子は引数を生成します"a"
(""
s"b"
は"
値の一部ではなく、ここでは値を表示するのに役立つように使用しています)。
の場合、a:b:\n
シェルに応じてand"a"
または、andになります。次のコマンドを使用して、すべてのシェルで一貫性を維持できます。"b"
"a"
"b"
""
./input $(cmd)""
(これは空の出力cmd
(または改行のみを含む出力)の場合、引数が./input
まったくない代わりに空の引数が受け取られるという意味でもあります。
例:
cmd() {
printf 'a b:: c\n'
}
input() {
printf 'I got %d arguments:\n' "$#"
[ "$#" -eq 0 ] || printf ' - <%s>\n' "$@"
}
IFS=:
set -o noglob
input $(cmd)
以下を提供します。
I got 3 arguments:
- <a b>
- <>
- < c>
また、これを行うときは、次の点に注意してください。
./input ""
これは"
シェル構文の一部であり、シェル引用演算子です。これらの"
文字はに渡されませんinput
。
^IFS スペース文字、各POSIXはロケールに分類された文字であり、ksh88(POSIX仕様のベース)とほとんどのシェルで発生する[:space:]
ように、これはまだSPC、TAB、およびNLに制限されています。$IFS
これに関して私が見つけた唯一のPOSIX互換シェルはですyash
。ksh93
(bash
5.0ベース)他のスペース(CR、FF、VTなど)も含まれていますが、シングルバイトスペースに制限されています(たとえば、Solaris)(一部の領域にはシングルバイトの切り捨て防止スペースが含まれています)