1

ダッシュ シェルを使用した Ubuntu 環境のサンプル コードで問題に直面しています。

次のコード ブロックを Ubuntu Server OS のダッシュ シェルで実行すると、以下のような出力が得られました。

#!/bin/sh
cmd="ls"
arg=" -lt"
exec "$cmd $arg"

出力 1 :

./test3.sh: 4: exec: ls  -lt: not found

しかし、次の変更されたコードを実行すると、以下のように正しい出力が得られました。

#!/bin/sh
cmd="ls"
arg=" -lt"
exec $cmd $arg

出力 2 :

root@ubuntu:~/test# ./test3.sh total 6164
-rwxr-xr-x 1 root root      45 Dec 10 05:40 test3.sh
-rw-r--r-- 1 root root   35962 Dec 10 03:29 debug.txt
4

2 に答える 2

3

最初のバージョンでは、二重引用符によって exec パラメーターのスペースがシェルによって解釈されないように保護されているため、スペースをexec含む単一の単語 "ls -lt" が表示されます。その名前のプログラムは存在しないため、失敗します。2 番目のバージョンでは、シェルはスペースを認識します。

arg2 番目のバージョンでは と の間にスペースがあるため、$cmdの値にスペースは必要あり$argませんが、害はありません。この単純なケースでは、実際には引用符はまったく必要ありませんが、引用符を含める習慣があれば、必要なときに忘れることはありません。

于 2013-12-09T15:07:27.957 に答える
1

最初のexecはコマンド「ls -lt」を見つけようとしています(コマンド名の一部としてスペースが含まれています。2番目の例(引用符を使用せずに)は、「ls」を使用して意図したとおりにコマンドを実行しています)はコマンドであり、「-lt」はそのコマンドの引数です。

于 2013-12-09T15:08:53.553 に答える