結果空の文字列をコマンドライン引数として渡します。

結果空の文字列をコマンドライン引数として渡します。

私は次のことを行います。

$ ./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

デフォルトには$IFSSPC、TAB、およびNL文字が含まれます(zsh他のシェルはNULを削除または終了します)。これら(NULではない)はIFS空白文字でもあり、IFS分割中に特に処理されます。

Split+glob 演算子は、 の出力がで引数があればcmd生成されます。 IFS空白文字の場合、1つ以上のIFS空白文字シーケンスが考慮されているため、空の引数を生成できません。" a b\nc \n""a""b""c"./inputsplit+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互換シェルはですyashksh93bash5.0ベース)他のスペース(CR、FF、VTなど)も含まれていますが、シングルバイトスペースに制限されています(たとえば、Solaris)(一部の領域にはシングルバイトの切り捨て防止スペースが含まれています)

おすすめ記事