次はどういう意味ですか?
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
私は特にこの部分に興味があります。
varible=$(...)
かっこが子プロセスを実行するために使用されることを知っていますが、括弧を一緒に使用するとどうなりますか$
?
答え1
Bashマニュアルで(man bash
):
コマンドの置き換え コマンド置換を使用すると、コマンド出力を置き換えることができます。 コマンド名。 2つの形式があります。 $(コマンド) または 「コマンド」 Bashはサブシェルでコマンドを実行して拡張を実行します。 環境とコマンドの置き換えを標準に置き換える 末尾の改行がすべて削除されたコマンドの出力。埋め込み 改行は削除されませんが、ワードプロセス中に削除される可能性があります。 分けた。コマンド置換 $(cat ファイル) は次のように置き換えることができます。 同じですが、より速い$(<ファイル)。
(これはすべてのBourne様シェル(たとえば、、など)で機能し、sh
NULksh
文字zsh
を含むbash
データzsh
もこの方法でキャプチャできます。)
注文する
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%/*}"
答え2
これは意味する走る中に何が入っていますか?括弧中サブシェルそして返品それ値、あなたの場合に割り当てますvarible
。
答え3
varible=$(..)
呼び出しコマンドの置き換えこれが意味するのは、シェルコマンドを実行し、その出力を変数に保存するか、echoコマンドを使用して再表示することです。たとえば、日付と時刻を表示するには、次のようにします。
echo "Today is $(date)"
変数に保存します。
SERVERNAME=$(hostname)
詳細は:https://www.cyberciti.biz/faq/unix-linux-bsd-appleosx-bash-割り当て-variable-command-output/