ฉันคิดว่ามันสะดวกที่จะใช้cd
กับอาร์กิวเมนต์ไฟล์
cd myDirectory/anyname.anyExtension
จะเทียบเท่า
cd myDirectory/
อะไรคือนามแฝงหรือหน้าที่ที่ดีที่สุดเพื่อให้บรรลุพฤติกรรมนี้
แก้ไข : ขอโทษฉันไม่ได้พูดถึงมันในสถานที่ที่ 1: ฉันใช้zsh
ฉันคิดว่ามันสะดวกที่จะใช้cd
กับอาร์กิวเมนต์ไฟล์
cd myDirectory/anyname.anyExtension
จะเทียบเท่า
cd myDirectory/
อะไรคือนามแฝงหรือหน้าที่ที่ดีที่สุดเพื่อให้บรรลุพฤติกรรมนี้
แก้ไข : ขอโทษฉันไม่ได้พูดถึงมันในสถานที่ที่ 1: ฉันใช้zsh
คำตอบ:
ในzsh
ฉันมักจะทำ:
cd /path/to/somefile(:h)
( h
สำหรับhead
)
หากsomefile
เป็น symlink คุณสามารถทำได้:
cd somefile(:A:h)
เพื่อไปยังไดเร็กทอรีที่พบเป้าหมายของ symlink
zsh
เทียบเท่าของคริสตอนนี้bash
การแก้ปัญหาเท่านั้นจะเป็น:
cd() {
[[ ! -e $argv[-1] ]] || [[ -d $argv[-1] ]] || argv[-1]=${argv[-1]%/*}
builtin cd "$@"
}
ในzsh
นอกจากนี้คุณยังสามารถกำหนดสิ่งที่ "คำว่า" Ctrl-Wลบออก
ในzsh
"คำว่า" ในบริบทของการเคลื่อนไหวคำตาม / transpose / วิดเจ็ตลบเป็นลำดับของ alnums บวกตัวอักษรในตัวแปรซึ่งเริ่มต้นโดยรวม$WORDCHARS
/
คุณสามารถลบ/
จาก$WORDCHARS
เพื่อให้Ctrl-Wเพียงลบองค์ประกอบหนึ่งเส้นทาง:
WORDCHARS=${WORDCHARS/\/}
ส่วนขยายที่มีประโยชน์อีกอย่างคือ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
คนที่เรียบง่ายใช้งานได้ดีzsh
แต่ BUT cd
นั้นไม่เทียบเท่าอีกต่อไปเมื่อcd ~
: /
[ -z "$1" ]
ก็เพียงพอแล้ว 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
-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)'
จะเปลี่ยนไดเรกทอรีในขณะที่ฟังก์ชันของคุณพยายามประเมินชื่อ