bashスクリプトがあるとしましょう/home/me/test/sh
。
#!/bin/bash
# cmd # here is the output of the cmd
pwd echo 'aaa' # /home/me
val=pwd echo 'aaa' # aaa
val=pwd echo 'aaa'$val # aaa
val=pwd echo 'aaa' && echo $val # aaa <and an empty line>
スペースで区切られたbashコードがどのように機能するのかわかりません。
ところで、ROSをインストールしてsetup.sh
bashというスクリプトを作成しましたが、このスクリプトを読んでいるので、この質問をします。次の行があります。
CATKIN_SHELL=bash /opt/ros/kinetic/_setup_util.py >> file.log
答え1
だからここで混乱しているのはコマンド形式です。ここで、コマンドの最初の単語は変数の割り当てです(シェルは存在するかどうかによって決まります=
)。
そのような場合、シェルはこれらの割り当てを評価しますが、ただ実行中のコマンドからこれらの変数をエクスポートします。特に、シェル自体はこれらの変数にアクセスできません。
これは、環境変数の影響を受けるコマンドまたはスクリプトを実行するのに役立ちます。この場合、シェルにエクスポートする必要はなく、単一の実行のために「ワンタイム」にするだけです。
コマンドを分析して一つずつ説明しましょう。
pwd echo 'aaa' # /home/me
[OK]をクリックすると、pwd
コマンドを実行して2つのecho
引数を渡しますaaa
。しかし、pwd
引数を受け入れないので、それらの2つを無視してローカルディレクトリを印刷します。
val=pwd echo 'aaa' # aaa
説明したように、これは変数の割り当てを実行し、$val
文字列を含めるように設定し、引数を使用してpwd
コマンドecho
を実行しますaaa
。$val
利用可能な変数ただecho
シェル自体ではなく、コマンドに!このecho
コマンドは実際に変数に対して何もしないので、aaa
コマンドが完了すると、$val
変数は次のように印刷されます。いいえシェルで定義されています。
val=pwd echo 'aaa'$val # aaa
再び上記のコマンドに似ています。決勝戦が$val
拡大すると予想できるので少し面倒です。しかし、変数は大きくなったシェルを通して、命令を通さず。そして、説明したように、シェルは$val
どちらがに設定されているのかを実際に見ずにコマンドpwd
(この場合echo
)だけをチェックするので、$val
上記と同じように空の文字列に拡張されます。
val=pwd echo 'aaa' && echo $val # aaa <and an empty line>
別のケースでは、$val
最初のコマンドが完了した後は使用できないため、echo
2番目のコマンドはフル実行中に実際にシェル自体に設定されないecho $val
ため、何も印刷しません(空白行のみを表示)。$val
シェルで設定するには、$val
コマンドなしで割り当てをスタンドアロンにする必要があります。たとえば、これは上記の動作とは異なります。
$ val=pwd; echo 'aaa' && echo $val
aaa
pwd
val=pwd
後ろに1が続くため、;
シェルはそれを独自のコマンドとして扱い、$val
現在のシェルに設定されているため、期待echo $val
どおりに機能します。
val=pwd; ...
(ここにも違い$val
がありますecho
。いいえval=pwd echo ...
変数の使用中にその環境で変数を表示する会議エクスポートしましたが、この場合シェルでは使用できません。 )
使用しているpwd
ことを考慮して、そのコマンドの出力を変数に保存したいかどうか疑問に思います。シェルコマンドの置換$(
、バックティックを使用するか、コマンドをおよびで囲むことをお勧めします)
。
最後の例は次のとおりです。
$ val=$(pwd); echo 'aaa' && echo $val
aaa
/home/me
または:
$ val=$(pwd) && echo 'aaa' && echo $val
aaa
/home/me
(ここには微妙な違いがあります。pwd
後者は、交換内部コマンド(この場合)が失敗し、ゼロ以外の状態で終了すると実行を中止します。この場合、次のコマンドは実行されません。;
そうでない場合、最初のコマンドは失敗します。でも、次のコマンドが実行されます。)
このコマンドについて理解していない部分が説明されることを願っています。
答え2
次のコードは、この構成のしくみを理解するのに役立ちます。
$ cd tmprun/
$ cat run.sh
echo $a
$ ./run.sh
$ a=bla ./run.sh
bla