ฉันพบว่าฉันมักจะทำต่อไปนี้:
%> cd bla/bla
%> ls
ฉันจะชอบมันที่ว่าเมื่อใดก็ตามที่ฉันในไดเรกทอรีที่มันไม่โดยอัตโนมัติcd
ls
ฉันเล่นซอกับฉันซัก.bashrc
พัก แต่ก็ไม่สามารถหาวิธีที่จะทำให้มันเกิดขึ้นได้
ฉันพบว่าฉันมักจะทำต่อไปนี้:
%> cd bla/bla
%> ls
ฉันจะชอบมันที่ว่าเมื่อใดก็ตามที่ฉันในไดเรกทอรีที่มันไม่โดยอัตโนมัติcd
ls
ฉันเล่นซอกับฉันซัก.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'