Bash ワイルドカード部分一致ディレクトリ

Bash ワイルドカード部分一致ディレクトリ

人々のシステムで部分的に変更されたディレクトリを見つけようとするbashスクリプトがあります。

cd "$HOMEDIR/AppData/Local/GitHub/PortableGit"*"/bin"

しかし、これはうまくいかないようです。文字列リテラルのみを許可します。

正しくサイズを変更する簡単な方法はありますか?

編集する:

まあ、変ですね。たまには効果がある時もありますよ。

私がこれを行うとき:

GIT_DIR=$HOMEDIR/AppData/Local/GitHub/PortableGit*/bin
eval GIT_DIR_PASS=$GIT_DIR
echo $GIT_DIR_PASS

正確な情報を得ました。

ただし、$ GIT_DIR_PASSを別の変数に割り当てようとすると、文字列リテラルバージョンが表示されます。

答え1

GIT_DIR=$HOMEDIR/AppData/Local/GitHub/PortableGit*/bin

上記のワイルドカードは、次のものを含むことができるスカラー変数に割り当てるため、拡張されません。一つ文字列なので、トークン化やファイル名の生成は発生しません。

eval GIT_DIR_PASS=$GIT_DIR

ここでは単純なコマンドの引数なので、ワイルドカードは拡張されますが、パスは"GIT_DIR_PATH=..."

echo $GIT_DIR_PASS

ここではワイルドカードが拡張されます。変数の内容を印刷する代わりに変数が参照されないため、拡張によって生成された引数のリストを印刷します。

あなたが望むもの:

set -- "$HOMEDIR"/AppData/Local/GitHub/PortableGit*/bin

つまり、パターンを一致するファイルのリストに展開し、それを$1$2...に割り当てます。

GIT_DIR=$1

最初のものを選択してください。

答え2

見てこの例方法を学びますbash。また、そのようなevalものを忘れてください。

/bin/直接サブディレクトリの直接サブディレクトリである名前が指定されたすべてのディレクトリと一致するglob .../PortableGit/

HOMEDIR=/home/$USER
ls "$HOMEDIR/AppData/Local/GitHub/PortableGit/"*"/bin"

私はcdそれがあなたの問題だと思います。正確に何をしたいですか?式に一致する複数のディレクトリがある場合、cdここで実行する予定が何でも一致する最初のディレクトリで終了するため、この方法で呼び出すことは役に立ちません。順番にディレクトリを入力してその中で作業を実行するには、一致する出力に対してループを実行する方がfind適切です。

同様の質問がありますスタックオーバーフロー

関連情報