私の状況は次のとおりです。
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`
に設定されます。その時点の現在のディレクトリにスペースまたはワイルドカードが含まれていない場合は、後でそのディレクトリから呼び出されます。SEARCH
SEARCH
find /original/directory -name
$SEARCH resources.xml
find
find /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 | …