スペースで区切られたbashスクリプトコマンド

スペースで区切られたbashスクリプトコマンド

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.shbashというスクリプトを作成しましたが、このスクリプトを読んでいるので、この質問をします。次の行があります。

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最初のコマンドが完了した後は使用できないため、echo2番目のコマンドはフル実行中に実際にシェル自体に設定されない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後者は、交換内部コマンド(この場合)が失敗し、ゼロ以外の状態で終了すると実行を中止します。この場合、次のコマンドは実行されません。;そうでない場合、最初のコマンドは失敗します。でも、次のコマンドが実行されます。)

このコマンドについて理解していない部分が説明されることを願っています。

おすすめ記事