วิธีใช้ bash builtin เพื่อแทนที่เอาต์พุตของ subshell หรือฟังก์ชัน


9

ฉันพยายามใช้สตริงย่อยของ bash ในตัวเพื่อแทนที่เอาต์พุตของ subshell หรือฟังก์ชัน bash อื่น

คำสั่งต่อไปนี้ทำงานได้ค่อนข้างดีใน zsh; แต่ส่งผลให้เกิดbad substitutionข้อผิดพลาดในทุบตี:

${${PWD##*/}//trunk/latest}

หรือ

${$(basename $PWD)//trunk/latest}

ผลลัพธ์ควรเป็นโฟลเดอร์สุดท้ายของ$PWD, แทนที่ด้วยlatestเมื่อไดเรกทอรีปัจจุบันของฉันคือtrunk

ดังนั้น/home/user/trunkควรเป็นlatest

มีการทุบตีเทียบเท่าอนุญาตให้สายโซ่รุ่นโดยไม่ต้องอาศัยตัวแปรหรือท่อ? หรือ bash บิวด์อินอนุญาตให้อินพุตเป็นสตริงหรือตัวแปรธรรมดาเท่านั้น?

คำตอบ:


9

zshไม่มีการทำรังของผู้ประกอบการทดแทนที่เป็นเอกลักษณ์

โปรดทราบว่ามีzshเช่นเดียวกับคุณยังสามารถทำ(t)csh${PWD:t:s/trunk/latest/}

แม้ว่าจะbashสนับสนุนตัวดัดแปลงประวัติ csh เหล่านั้นสำหรับการขยายประวัติ แต่ก็ไม่รองรับพวกมันสำหรับการขยายพารามิเตอร์

ที่นี่ด้วยbashใช้ตัวแปรชั่วคราว:

var=${PWD##*/} var=${var//trunk/latest}

3

ลองสิ่งนี้ด้วยการทุบตี:

[[ $PWD =~ .*/(.*) ]] && echo "${BASH_REMATCH[1]//trunk/latest}"

หรือด้วยคำสั่งเดียว:

[[ $PWD =~ .*/(.*) && ${BASH_REMATCH[1]//trunk/latest} =~ (.*) ]]

ผลที่ได้คือ ${BASH_REMATCH[1]}


0

คุณต้องการ ...

PWD=latest

ฉันไม่เห็นวิธีการตามคำขอของคุณ หากคุณต้องการแทนที่ทั้งหมด$PWDด้วยล่าสุด - แม้ว่าวิธีที่ดีที่สุดในการทำเช่นนั้นคือเปลี่ยนเป็นcdล่าสุด

[ /home/user/trunk = "$PWD" ] && OLDPWD=../latest cd -

... ซึ่งจะพาคุณไปยังล่าสุดและพิมพ์ชื่อพา ธ ไปยัง stdout คุณจะได้รับกลับมาทางขวาที่คุณมาจากโดยการทำcd -อีกครั้ง คุณสามารถทำเช่นเดียวกันกับ$CDPATH:

mkdir -p /tmp/{1..5}  ; \
CDPATH=/tmp cd 3; cd -; \
echo "${CDPATH:-empty or unset::}" "$OLDPWD"

/tmp/3
/home/mikeserv
empty or unset:: /tmp/3

ปัญหาไม่ได้อยู่ในการทดแทนตัวมันเองก็สามารถทำได้sedในไม่กี่ขั้นตอน แต่ฉันไม่เข้าใจว่าทำไมทุบตีปฏิเสธที่จะดำเนินการ subshell แล้วแทนที่เนื้อหาของมันเช่นสายอื่น ๆ
yabuki_joe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.