コマンドの最後のパイプを無視してパスワードを変更するスクリプトを受け取りますか?

コマンドの最後のパイプを無視してパスワードを変更するスクリプトを受け取りますか?

私はパス内のスクリプトのディレクトリに変更できる小さなスクリプトを作成しました。これは、元のスクリプトと同じフォルダにある編集したい他のスクリプトにすばやくアクセスするのに役立ちます。

私は歴史を振り返り、コマンドの前に何かプレフィックスを付ける傾向があります。

$ . cdbin my_super_script

これはほとんどの場合うまくいきます。しかし、私が最後に実行したコマンドがどこかにパイプされるときはうまくいきません。

例えば

# if my last command was the following
$ my_super_script | grep -v bad | grep good

# then when I try and run my cdbin script using history, it looks like this
$ . cdbin my_super_script | grep -v bad | grep good

これは何もしません。エラーも発生せず、現在のディレクトリにそのまま残ります。

私の簡単なcdbinスクリプトは次のとおりです。

CDBIN

PROG=$(which "$1")
DIR=$(dirname "$PROG")
cd "$DIR" 

編集:たとえば、次のように簡単に入力すると、この問題を回避できることがほとんどですが、$ . cdbin !:0入力するのは少し厄介です。 :D

ベストアンサー1

パイプを使ってこのプログラムを実行すると、あなたの. cdbinコマンドはサブシェルで実行されます:したがってサブシェルのディレクトリが変更され、サブシェルが閉じると効果が消えます。

これを防ぐために注文する以前これを実行したことがあり、履歴を使用してください。

. cdbin !!:0

これは前のコマンドの最初の単語の抽出したがって、あなたのシナリオでは、次のように終了します。

. cdbin my_super_script

fc次のコマンドを使用して前のコマンドを抽出できます。

. cdbin $(fc -l -1 | awk '{print $2}')

cdbinたとえば、引数なしで呼び出されると、使いやすくエイリアスに変換したり、それ自体の一部にすることができます。

CMD=${1:-$(fc -l -1 | awk '{print $2}')}
PROG=$(which "$CMD")
DIR=$(dirname "$PROG")

cd "$DIR" 

unset CMD PROG DIR

おすすめ記事