回答:
Bashマニュアル(man bash)から:
コマンド置換
コマンド置換により、コマンドの出力が
コマンド名。2つの形式があります。
$(コマンド)
または
「コマンド」
bashは、サブシェルでコマンドを実行することによって拡張を実行します
環境とコマンド置換を標準に置き換える
末尾の改行が削除されたコマンドの出力。埋め込み
改行は削除されませんが、単語の途中で削除される場合があります
分割。コマンド置換$(cat file)は、
同等ですが高速な$(<ファイル)。
(これは、すべてのBourneシェルのような、すなわちのためにも当てはまるsh、ksh、zsh、bashなど、そしてzshまた、このように埋め込まれたNUL文字でデータをキャプチャすることができます)
コマンド
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
スクリプトが配置されているディレクトリの名前を(すべてのバックスラッシュをスラッシュに変更しながら)変数に割り当てますbasedir。標準エラーストリームに出力されるエラー、警告、またはその他の診断メッセージは、引き続き端末に表示されます($(...)コマンドの標準出力のみをキャプチャします)。
シェルは、最も内側のコマンド置換を実行することから始めます。
echo "$0" | sed -e 's,\\,/,g'
その出力は文字列としてに与えられdirname、その出力は変数に割り当てられますbasedir。
二重引用符は、単語分割やファイル名の展開が行われないようにするためのものです。そうしないと、$0(スクリプトの実行に使用するパスを含むスクリプトの名前)にスペースが含まれていると、スクリプトが失敗したり、奇妙な出力が生成されたりする場合があります。文字またはファイル名のグロビング文字(?またはなど*)。
一般に、常に展開(変数展開、コマンド置換、および算術展開)を引用することをお勧めします。これが良いアイデアである理由についての優れた説明については、この質問とその回答を参照してください。
スクリプトが次のように実行された場合
$ /usr/local/bin/script.sh
次にbasedirの値を取得します/usr/local/bin。
または、Cygwinで:
$ bash c:\\Users\\Me\\script.sh
次にbasedirの値を取得しますc:/Users/Me。この場合のコマンドラインでの二重円記号は、シェルから単一の円記号をエスケープするためのものです。の実際の値は$0ですc:\Users\Me\script.sh。
もう使用しなくても同じことを行う方法dirname、echoおよびsedだろう
basedir="${0//\\//}"
basedir="${basedir%/*}"
/bin/shSolaris 10以前のものと同様)はをサポートしていません$(...)。
varible=$(..)呼ばれるコマンド置換およびそれの手段にすぎないが、シェルコマンドを実行して、echoコマンドを使用して、変数またはディスプレイ背面にその出力を格納します。たとえば、日付と時刻を表示します。
echo "Today is $(date)"
そしてそれを変数に保存するために:
SERVERNAME=$(hostname)
詳細:https : //www.cyberciti.biz/faq/unix-linux-bsd-appleosx-bash-assign-variable-command-output/
man bash