回答:
でzsh
、私はよくやります:
cd /path/to/somefile(:h)
(h
ためhead
)。
somefile
がシンボリックリンクの場合、次のこともできます。
cd somefile(:A:h)
シンボリックリンクのターゲットが見つかる可能性があるディレクトリに移動します。
zsh
クリスの今の同等bash
のみのソリューションは次のようになります。
cd() {
[[ ! -e $argv[-1] ]] || [[ -d $argv[-1] ]] || argv[-1]=${argv[-1]%/*}
builtin cd "$@"
}
ではzsh
、「単語」がCtrl-W削除するものを再定義することもできます。
ではzsh
、単語ベースのモーション/転置/削除ウィジェットのコンテキストでの「単語」は、一連のalnumと、$WORDCHARS
デフォルトでを含む変数内の文字です/
。
あなたは削除することもできます/
から、$WORDCHARS
そのようCtrl-W唯一のパスコンポーネントを削除します。
WORDCHARS=${WORDCHARS/\/}
もう1つの便利な拡張機能は、select-word-style
さまざまな単語スタイルをインタラクティブに選択するために使用できるウィジェットです。
autoload select-word-style
zle -N select-word-style
bindkey '\ew' select-word-style
次に、を押すとAlt-W、さまざまな単語スタイルを選択できます。
$ cd /blah/blih<Alt-W>
Word styles (hit return for more detail):
(b)ash (n)ormal (s)hell (w)hitespace (d)efault (q)uit
(B), (N), (S), (W) as above with subword matching
?
zsh
と単語スタイルに関する非常に興味深い編集。zsh
コマンドもありがとうございます。それは完全に仕事をします。
ディレクトリを入力し、を使用している場合でも、元の機能を保持する必要があると思いますbash
。
cd() {
local file="${!#}"
if (( "$#" )) && ! [[ -d "$file" ]]; then
builtin cd "${@:1:($#-1)}" "${file%/*}"
else
builtin cd "$@"
fi
}
cdのオプション(-P
など)を使用する予定がない場合は、これでも十分です。
cd() {
if [ -d "$1" ] || [ -z "$1" ]; then
builtin cd "$@"
else
builtin cd "${1%/*}"
fi
}
builtin
は、cd
呼び出しの前に必ず追加してください
cd
オプションを保持するバージョンは、では機能しませんzsh
。シンプルな1はで罰金を働かないzsh
、しかしcd
としてもはや同等ですcd ~
:/
[ -z "$1" ]
だけで十分でした。Stephaneの回答は、の最善の解決策であると思われるため、視認性を高めるために受け入れましたzsh
。
あなたdirname
はパスからファイル名を取り除くために使うことができます、例えば
mycd() { cd "$(dirname "$1")"; }
を参照してくださいman dirname
。
これをに追加して.profile
ロードすると(source ~/.profile
またはログアウトして再度ログインすると)、mycd [file or directory]
正しいディレクトリに移動します。
mycd() { if [ -d "$1" ]; then cd "$1"; else cd "$( dirname "$1" )"; fi ; }
名前を付けるとcd
、奇妙なことが起こります。
zsh
。
cd
ようにargsを渡すと、これは壊れ-P
ます。
cd2() {
arg=() dir= cmd= IFS=" " msg='[-L|[-P [-e]]|-h] [dir|file]'
while [ "$#" -gt 1 ] ; do
case "$1" in
-h) printf "%s: cd2 %s\n" "$0" "$msg"
return 1 ;;
*) arg+=("$1") ;;
esac
shift
done
[ -f "${1:-}" ] && dir="$(dirname ${1:-})" || dir="${1:A}"
[ ! -z "$arg" ] && cmd="cd ${arg[@]} $dir" || cmd="cd $dir"
if ! $cmd 2>/dev/null; then
printf "%s: cd2 %s\n" "$0" "$msg"
return 1
fi
}
$(sudo reboot)
場合、この関数はシステムを再起動します。また、ユーザーはではzsh
なくを使用していbash
ます。
cd '$(sudo reboot)'
ディレクトリを変更しますが、関数は名前を評価しようとします。