一人に会った素晴らしい方法.bashrcファイルに機能を追加して、2つ以上のディレクトリレベルに移動します。
.bashrc ファイルを開き、次の関数を挿入します。
#user defined functions
function cd_up() {
cd $(printf "%0.s../" $(seq 1 $1 ));
}
alias 'cd..'='cd_up'
どうやって読むのか知りたいです。
どの言語で書かれていますか?
答え1
の内容は、.bashrc
スクリプトや対話型シェルを実行するのと同じように、Bash自体によって実行されます。これは多くの拡張機能を備えたPOSIXシェル言語のバリエーションです(一部は主にKshなどの他のシェルから借用されており、一部はBash自体によって生成されます)。
ここではfunction cd_up() { ... ; }
関数が定義されます。標準形式はキーワードcd_up() { ... ; }
なしですfunction
。これは$(...)
、内部的にコマンドを実行し、その出力をコマンドライン引数として使用するコマンドの置き換えです。
これがprintf "%0.s../"
まさに秘訣です。printf
書式文字列(C関数に似ています)とprintf()
書式文字列を使用して印刷される複数の引数を受け入れます。重要なのは、すべての引数を使用するのに必要なだけ書式文字列を繰り返すことです(C関数はこれを実行せず、実行することもできません)。指定子は、%0.s
引数を幅0の文字列として印刷するように指示するので、実際には引数は次のようになります。いいえ印刷。
しかし、変わらない部分../
はい各引数に対して一度印刷します。つまり、printf "%0.s../" a b
2回印刷されます。これは$(seq 1 $1)
別のコマンド置換であり、seq
数値リストが印刷されるため、必要な数の引数を提供するために使用されますprintf
。$1
現在の関数の最初のパラメータですcd_up
。
たとえば、cd_up 2
最初に実行してseq 1 2
印刷します1 2
。これはパラメータとして渡され、どちらが印刷されるかを取得printf
できます。ディレクトリツリーは2つのレベルの上に渡され、実行されます。printf "%0.s../" 1 2
../../
cd
cd ../../
を使用すると、set -x
シェルが実際に実行するコマンドを表示できます。 Bashは、次の表記法でネストされたレベルを表します+
。
/tmp/foo$ set -x
/tmp/foo$ cd_up 2
+ cd_up 2
+++ seq 1 2
++ printf %0.s../ 1 2
+ cd ../../
/$
あまりありません。何出力はseq
正しい数の単語があることです。コマンド置換が引用されていないため、出力は次のように進められます。噴射、これはスペースから複数の引数に分割されることを意味します。printf "%0.s../" "$(seq 1 $1)"
常に書式文字列の後に引数を1つだけ渡します。 (リンクされたページの例を参照してください。)
同様の関数を書くが、技術があまり必要でない別の方法は、単純なループを使用することです。ほぼPOSIX shにあります(local
POSIXではありません):
cd_up() {
local i=$1
while [ "$i" -gt 0 ]; do
cd ..
i=$((i - 1))
done
}
または、Bash/Zsh では演算 for ループを使用します。
cd_up() {
local i
for (( i=$1; i > 0; i-- )); do
cd ..
done
}
バージョンは一度だけ実行されるため、中間ディレクトリではなく元のディレクトリに戻るため、printf
より良いです。 (この問題を解決することは練習問題のままです。)cd
cd -
シェル言語のリソースについては、次を参照してください。
答え2
bashrcは、bashがインタラクティブに起動されるたびに実行されるbashスクリプトです。