ฉันพบว่าฉันมักจะทำต่อไปนี้:
%> cd bla/bla
%> ls
ฉันจะชอบมันที่ว่าเมื่อใดก็ตามที่ฉันในไดเรกทอรีที่มันไม่โดยอัตโนมัติcdls
ฉันเล่นซอกับฉันซัก.bashrcพัก แต่ก็ไม่สามารถหาวิธีที่จะทำให้มันเกิดขึ้นได้
ฉันพบว่าฉันมักจะทำต่อไปนี้:
%> cd bla/bla
%> ls
ฉันจะชอบมันที่ว่าเมื่อใดก็ตามที่ฉันในไดเรกทอรีที่มันไม่โดยอัตโนมัติcdls
ฉันเล่นซอกับฉันซัก.bashrcพัก แต่ก็ไม่สามารถหาวิธีที่จะทำให้มันเกิดขึ้นได้
คำตอบ:
คุณสามารถทำได้ด้วยฟังก์ชั่น:
$ cdls() { cd "$@" && ls; }
&&หมายถึง ' cdไปยังไดเรกทอรีและหากประสบความสำเร็จ (เช่นไดเรกทอรีที่มีอยู่) วิ่งls' ใช้&&ประกอบการจะดีกว่าแล้วใช้อัฒภาคผู้ประกอบการที่อยู่ในระหว่างทั้งสองคำสั่งเช่นเดียวกับ; { cd "$@" ; ls; }คำสั่งที่สองนี้จะทำงานlsโดยไม่คำนึงว่าcdทำงานหรือไม่ หากcdล้มเหลวlsจะพิมพ์เนื้อหาของไดเรกทอรีปัจจุบันของคุณซึ่งจะทำให้ผู้ใช้สับสน ในฐานะที่เป็นวิธีที่ดีที่สุด, การใช้งานและไม่ได้&&;
$ cdls /var/log
CDIS.custom fsck_hfs.log monthly.out system.log
$ pwd
/var/log
cdโดยทั่วไปก็คือการปฏิบัติที่ดีที่จะเปลี่ยนชื่อคำสั่งที่มีอยู่แล้วโดยเฉพาะอย่างยิ่งสำหรับคำสั่งที่เรียกกันว่าเหมือน สร้างคำสั่งใหม่ด้วยชื่ออื่นแทน หากคุณเขียนทับcdด้วยฟังก์ชั่นหรือชื่อแทนซึ่งมีชื่อcdเหมือนกันจะเกิดอะไรขึ้นเมื่อคุณเข้าสู่ไดเรกทอรีที่มี 100,000 ไฟล์ มีสาธารณูปโภคหลายอย่างที่ใช้cdและพวกเขาอาจสับสนกับพฤติกรรมที่ผิดปกตินี้ หากคุณใช้บัญชีที่ใช้ร่วมกัน (เช่นrootเมื่อคุณทำงานกับผู้ดูแลระบบอื่น ๆ ) มันอาจเป็นอันตรายอย่างยิ่งที่จะแทนที่คำสั่งที่มีอยู่เนื่องจากสภาพแวดล้อมนั้นแตกต่างจากที่คนคาดหวัง
pwdฉันปรับปรุงคำตอบของฉันเพื่อแสดงการส่งออกของ ไม่แน่ใจว่านี่เป็นวิธีปฏิบัติที่ดีที่สุดหรือไม่ แต่เป็นเรื่องปกติ ดูตัวอย่างtldp.org/LDP/abs/html/aliases.html
cd() { builtin cd "$@" && pwd; };- ใช้เชลล์ bourne มาตรฐานบน macOS (Sierra 10.12.6)
ฉันมีสิ่งนี้ใน bashrc ของฉันและใช้งานได้ดี
function cd {
builtin cd "$@" && ls -F
}
ก่อนหน้านี้ใน. bashrc ของฉันฉันมี: [ -z "$PS1" ] && return, และทุกอย่างหลังจากบรรทัดนั้นใช้กับเซสชันแบบโต้ตอบเท่านั้นดังนั้นสิ่งนี้จะไม่ส่งผลกระทบต่อการcdทำงานของสคริปต์
[ -z "$PS1" ] && returnทำอย่างไร
[ -z "$PS1" ]ตรวจสอบว่า$PS(ตัวแปรพร้อมต์แบบโต้ตอบ) เป็น "zero length" (-z) หรือไม่ หากความยาวเป็นศูนย์หมายความว่าไม่ได้ตั้งค่าไว้ดังนั้น Bash จะต้องไม่ทำงานในโหมดโต้ตอบ && returnส่วนหนึ่งออกจากการจัดหา.bashrcที่จุดนี้ภายใต้เงื่อนไขเหล่านี้
iใน:"$-" case "$-" in *i*) ;; *) return ;; esac
PS1ตัวแปรอาจไม่ได้ตั้งค่าหรือว่างเปล่าและเชลล์อาจยังคงทำงานอยู่ (แต่ไม่มีพรอมต์) ฉันจะตรวจสอบ$-เพื่อให้แน่ใจ
นอกหัวข้อเนื่องจากคำถามถูกติดแท็ก / bash แต่เนื่องจากคำถามบางคำถามถูกปิดเหมือนของคำถามนี้ที่ไม่ได้กล่าวถึง bash:
ด้วย zsh:
chpwd() ls
ฟังก์ชั่น chpwd () ถูกเรียกโดย zsh เมื่อใดก็ตามที่ไดเรกทอรีปัจจุบันเปลี่ยนแปลง (โดยวิธี cd, pushd, popd ... ) tcsh มีคุณสมบัติที่คล้ายกันและน่าจะเป็นที่ zsh ได้มาจาก
ทำไมไม่เพิ่มชื่อแทนลงในไฟล์. bashrc ของคุณ
สิ่งที่ต้องการ:
alias cdls='cd "$@" && ls'
โซลูชันทั่วไปของการสร้างนามแฝงสำหรับคำสั่ง cd นั้นไม่สมบูรณ์เพราะมีคำสั่งอื่น ๆ ที่สามารถเปลี่ยนไดเรกทอรีปัจจุบันของคุณเช่น popd หรือแม้แต่เรียกใช้สคริปต์ด้วยคำสั่ง cd ในนั้น
เป็นการดีกว่าที่จะใช้ $ PROMPT_COMMAND Bash hook ซึ่งดำเนินการคำสั่งก่อนที่จะส่งคืนพรอมต์
คำสั่ง (ฟังก์ชั่นในกรณีของเรา) จะดำเนินการ ls เฉพาะในกรณีที่ไดเรกทอรีมีการเปลี่ยนแปลงเพื่อลดเสียงรบกวนหน้าจอ รหัสสำหรับ. bashrc:
#each console has its own file to save PWD
PrevDir=$(tty)
PrevDir=/tmp/prev-dir${PrevDir////-}
#don't ls when shell launched
echo $PWD > $PrevDir
LsAfterCd() {
[[ "$(< $PrevDir)" == "$PWD" ]] && return 0
ll --color=always | sed 1d
echo $PWD > $PrevDir
}
PROMPT_COMMAND=LsAfterCd
คัดลอกนี้:
altercd(){ cd(){ unset -f cd ; cd $*; ls ; altercd; } } ; altercd
ตอนนี้คุณสามารถทำซีดีง่าย ๆ :
cd /
(files listed)
cd /home
(files listed)
etc...
ในทุบตีคุณไม่สามารถเกิดขึ้นอีกครั้งเพื่อนามแฝงสำหรับการกระทำที่ต้องใช้พารามิเตอร์ สำหรับเรื่องนี้มีฟังก์ชั่น ดังนั้นใส่ใน~/.bashrcสิ่งต่อไปนี้ของคุณ
mycd() {
cd "$1"
ls
}
function mycd { builtin cd "$1" && ls "$2" } ดีกว่าการใช้คำพูด:
วางรหัสด้านล่างใน. profile และใช้งานได้ ทดสอบในกล่อง HP-Unix
cdl()
{
if [ "$#" = 0 ]; then
cd ~ && ls -ltr
elif [ -d "$@" ]; then
cd "$@" && ls -ltr
else
echo "$@" directory not found!!!
fi
}
#SET YOUR ALIAS TO CD
alias cd="cdl"
สะดวกยิ่งขึ้น - ด้วยความสามารถในการย้อนกลับไปในประวัติศาสตร์ :
function cd() {
if [ -d "$@" ]; then
echo -n "Stack: "
pushd "$@"
ls
else
builtin cd "$@"
fi
}
function popd() {
builtin popd "$@" && ls
}
เมื่อคุณเปลี่ยนไดเรกทอรีบรรทัดด้วย: Stack: (current_dir) (previous_dir) ...จะปรากฏขึ้นจากนั้นlsส่งออก ที่จะกลับไปในประวัติศาสตร์ dirs เพียง pop popdคำสั่งนี้:
ฉันเพิ่มelseดังนั้นคุณจะเห็นข้อผิดพลาดเมื่อพยายามไปที่ไดเรกทอรีผิด
ฉันคิดว่าเป็นการดีที่จะเปิดใช้งานlsตัวเลือกด้วยวิธีนี้เนื่องจากcdไม่มีตัวเลือก
cdls() {
cd ${$#} && ls ${@:0:$#-1}
}
cdใช้ตัวเลือก
นี่คือสิ่งที่ฉันพบว่ามีประโยชน์ (บน Debian 9):
c() {
cd "${@}" \
&& ls --color=always -C \
| sed '
# on line 5, print the line,
5 {
# append an ellipsis
a[...]
# and quit
q
}
# print lines 1-4 verbatim
'
}
สิ่งนี้ให้ผลลัพธ์ที่ถูกตัดทอนด้วยจุดไข่ปลาในกรณีที่มีรายการมากเกินไปในไดเรกทอรีนั้นเพื่อให้คอนโซลยังคงสะอาดอยู่:
$ c data/git/buildroot/package/
4th lua-markdown
a10disp lua-messagepack
acl lua-msgpack-native
acpica luaossl
acpid lua-periphery
[...]
$ ls -1 | wc --lines
1977
alias cd='builtin cd $1 && ls -l && builtin cd $1'