コマンド置換の使用を正当化する問題/パターンは何ですか?

コマンド置換の使用を正当化する問題/パターンは何ですか?

私はDrupal / WordPressアプリケーションを実行しているDigitalOceanなどの「自己管理シェル」ホスティングプロバイダでUbuntuとBashを使用していくつかのサーバー環境を構築しました。

今回はいわゆる」コマンドの置き換え」。

私は、Bashプログラマーがこの概念の「パターン」を使用する必要がある場合、どのような問題が発生するのか尋ねました。例えばください。

答え1

コマンド置換とは、シェルコマンドを実行し、その出力を変数に保存するか、echoコマンドを使用して再表示することを意味します。たとえば、日付と時刻を表示するには、次のようにします。

echo "Today is $(date)"

私のコマンドが他のコマンドや例の出力を引数として受け取るときに便利です。

答え2

~からPOSIX規格のコマンド置換セクション:

コマンド置換を使用すると、コマンド名自体をコマンドの出力に置き換えることができます。

コマンド置換を使用すると、コマンド出力を最初に一時ファイルに書き込んでから、そのファイルから読み取らなくても便利な方法で使用できます。これは、コマンドの出力が1行の短い文字列である場合に最適です。

一部の人々は、出力が複数行の文書であっても、コマンドの出力を収集するためにコマンド置換を使用します。これは一般的にいいえコマンド置換を使用する良い方法です。代わりに、パイプまたは一時ファイルを使用して処理ステップ間でデータを渡す標準のUnixイディオムを使用してください。


私が使用するコマンド置換の例:

たとえば、現在のユーザーが root でスクリプトを実行していることを確認するには、次のようにします。

if [ "$( id -u )" -ne 0 ]; then
   echo 'This script requires root privileges, re-run with sudo' >&2
   exit 1
fi

コマンド置換は、現在のユーザーのUID(整数)を返す$(id -u)出力を置き換えます。id -u

他の例。コミットに署名するためにGnuPGを使用していますgit。 GnuPGが正しく機能するためには、GPG_TTY対話型シェルの初期化ファイルに現在の端末デバイスの名前を設定する必要があります。私はこれを一緒にする

export GPG_TTY="$( tty )"

これは、シェルセッションの現在の端末デバイスの場所によって異なりますGPG_TTY/dev/ttyp4

他の例。特別なケースでは、Solarisシステムで実行する必要があるスクリプトがあります。

case "$( uname -s )" in
    SunOS)
        # code specific for Solaris
        ;;
    *)
        # code for all other Unix platforms
esac

他の例。このgetconf PATHコマンドは、現在のシステムの「デフォルトパス」を返します。私は特定の状況でPATH変数を「標準デフォルト」値にリセットするためにこれを使用しました:

PATH="$( getconf PATH )"

答え3

私はそれを頻繁に使用しますfind。たとえば、次のようになります。

tar cvf ../junk.tar `find .`

また、貧しい人々のIDEの一部として次のようになります。

vi `grep mysearcstring *.[ch]`

上記はコマンドラインの例です。私はまた私のスクリプトでそれをたくさん使用し、それがなければ困難を経験します。おそらく最も一般的なケースは、上記のようにコマンド出力でシェル変数を設定することです。

NOW=`date`

私はバックティックを使用する古い習慣に従っていますが、ある$(command)バックティックを別のバックティックに挿入できるので、構文ははるかに優れています。バックティックでは、エスケープ文字をどこに置くべきかを知る必要がありますが、\これは面倒です。

答え4

この使用法を必要とする実装パターンは、Unixシェルが子プロセスに組み込まれていないすべてのコマンドを実行することです。子プロセスは親プロセスのコンテキストを変更できません。コマンドの置き換えにより、シェルは、シェルスクリプトに作成されたコマンドラインまたはコマンドラインに入力されたように、組み込まれていないコマンドのテキスト出力を使用する可能性があります。

関連情報