私はパス内のスクリプトのディレクトリに変更できる小さなスクリプトを作成しました。これは、元のスクリプトと同じフォルダにある編集したい他のスクリプトにすばやくアクセスするのに役立ちます。
私は歴史を振り返り、コマンドの前に何かプレフィックスを付ける傾向があります。
$ . 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