変数からコマンドを実行する方法

変数からコマンドを実行する方法

私の状況は次のとおりです。

SEARCH="find `pwd` -name"

bash> $SEARCH resources.xml | grep $SEARCH_DIR | grep $1 | grep ‘cells’

pwdただし、その変数で参照されている内容は不明です。

答え1

alias SEARCH='find . -name'

または

SEARCH() { find . -name "$1"; }

使用法

SEARCH resources.xml | ...

これはSEARCH変数ではありません。コマンドを変数(SEARCH='find . -name')として定義できますが、エイリアスまたは関数定義がより一般的です。

答え2

現在のディレクトリは、行が評価された/original/directoryときと行が評価されたときと想定されます。SEARCH=…/later/directory$SEARCH …

変数が定義されると、コマンド置換が評価されるため`pwd`に設定されます。その時点の現在のディレクトリにスペースまたはワイルドカードが含まれていない場合は、後でそのディレクトリから呼び出されます。SEARCHSEARCHfind /original/directory -name$SEARCH resources.xmlfindfind /original/directory -name resources.xml

元の現在のディレクトリにスペースまたはワイルドカードが含まれている場合、この操作は機能しません。このような変数にコマンドを入力することは、非常に単純な場合を除いては機能しません。バラよりスペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?

findで実行するには、/later/directoryを実行しますfind .。しかし、ここで変数は正しいツールではありません。変数は文字列を格納するために使用されます。パラメータを持つコマンドは文字列ではありませんが、リストひも。シェルコードスニペットは文字列として保存できます$SEARCHが、いいえSEARCHシェルフラグメントで値を実行します(もう一度参照)。スペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?)。後で使用するためにシェルコードスニペットを保存する関数を定義します。

SEARCH () {
  find "$PWD" -name "$@"
}
SEARCH resources.xml | …

繰り返しますが、findで実行する/later/directory最善の方法は、ディレクトリを変数に保存し、後でその変数を使用することです。find/original/directory

original_directory="$PWD"
SEARCH () {
  find "$original_directory" -name "$@"
}
SEARCH resources.xml | …

関連情報