ディレクトリツリーをより速く返すために、.zshrcファイルにこの小さな関数を作成しました。
#: Move back x director(y/ies).
function bak ()
{
local x=""
local limit="$1"
local msg="Can't move back $limit directories"
[ -z "$limit" ] && limit=1
for ((i=0;i<limit;i++)); do
x="../$x"
done
if ! cd "$x"; then
echo "$msg";
fi
}
2つの注意事項を除いて、うまく機能します。
関数が実行され、ディレクトリツリーから再度移動できるときに制限(ルート "/")を超えると、関数はエラーメッセージを出力しません。だから基本的にこの部分は
if ! cd "$x"; then echo "$msg"; fi
何もしません。
その部分(エラーメッセージを印刷するifステートメント)を削除すると、機能は機能しなくなります。
誰もがエラーメッセージの一部が機能するのを助けることができますか?また、誰かがエラーメッセージの一部を削除すると、機能が中断される理由を説明できると思います。
答え1
ほとんどのシステムでは、パスは/..
ルートディレクトリと同じファイルを参照します。/
これは許可されますが、POSIXでは必須ではありません。:
特殊ファイル名dot-dotは、古いファイルの親ディレクトリを参照する必要があります。特別な場合には、ルートディレクトリのドットポイントはルートディレクトリ自体を参照できます。
/..
デフォルトでは、シェル以外のシステムでも呼び出さずに呼び出すと/
実行されます。cd
-P
cd -L
論理的 cd
、どこで、いつ$PWD
( /a/b/c
他のディレクトリへのシンボリックリンクがどこにあるか、最も可能性/a
が高い)を実行し、たとえばを実行する代わりに実行し、それを実行する場合は、次のようにします(例:/a/b
/a/b/c
cd ../..
chdir("../..")
cd
chdir("/a")
cd ../../../../../../..
cd
chdir("/")
POSIXの要件)。
また、エラーメッセージはstderrに送信する必要があります。
bak() {
local x limit="${1-1}"
repeat "$limit" x+=../
cd "$x" && return
local ret=$?
print -u2 "Can't cd back $limit directories"
return "$ret"
}
エラーメッセージは重複する可能性がありますが、cd
エラーメッセージはすでに記録されています。
bak
指定された制限がのコンポーネント数より大きい場合、失敗を返すには、$PWD
次のようにします。
bak() {
local depth=0 dir=$PWD x
repeat "${1-1}" {
if [[ $dir = / ]]; then
print -u2 "The current working directory is only $depth level deep"
return 1
fi
dir=$dir:h x+=../
((depth++))
}
cd "$x"
}