แสดงเส้นทางในแบบที่มนุษย์อ่านได้


43

ฉันต้องการแสดงตัวแปรสภาพแวดล้อม PATH ในแบบที่มนุษย์อ่านได้มากขึ้น

$ echo $PATH
/Users/arturo/.rvm/gems/ruby-1.9.3-p392/bin:/Users/arturo/.rvm/gems/ruby-1.9.3-p392@global/bin:/Users/arturo/.rvm/rubies/ruby-1.9.3-p392/bin:/Users/arturo/.rvm/bin:/usr/local/git/bin:/Users/arturo/.gvm/groovy/current/bin:/Users/arturo/.gvm/grails/current/bin:/Users/arturo/.gvm/griffon/current/bin:/Users/arturo/.gvm/gradle/current/bin:/Users/arturo/.gvm/lazybones/current/bin:/Users/arturo/.gvm/vertx/current/bin:/Users/arturo/.gvm/bin:/Users/arturo/.gvm/ext:/usr/local/git/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin

ฉันกำลังคิดในบางสิ่งเช่นนี้:

$ echo $PATH | some cut and awk magic
/Users/arturo/.rvm/gems/ruby-1.9.3-p392/bin
/Users/arturo/.rvm/gems/ruby-1.9.3-p392@global/bin
/Users/arturo/.rvm/rubies/ruby-1.9.3-p392/bin
/Users/arturo/.rvm/bin
...

คำตอบ:


62

trคุณสามารถใช้

$ tr ':' '\n' <<< "$PATH"
/Users/arturo/.rvm/gems/ruby-1.9.3-p392/bin
/Users/arturo/.rvm/gems/ruby-1.9.3-p392@global/bin
/Users/arturo/.rvm/rubies/ruby-1.9.3-p392/bin
...

คุณสามารถทำได้ในเชลล์บางตัว (ทดสอบใน bash และ zsh):

echo -e ${PATH//:/\\n}

ใน zsh คุณสามารถใช้$pathตัวแปรเพื่อดูเส้นทางของคุณด้วยช่องว่างแทนโคลอน

$ echo $path
/Users/arturo/.rvm/gems/ruby-1.9.3-p392/bin /Users/arturo/.rvm/gems/ruby-1.9.3-p392@global/bin /Users/arturo/.rvm/rubies/ruby-1.9.3-p392/bin /Users/arturo/.rvm/bin

ซึ่งสามารถใช้ร่วมกับหรือprintfprint

$ printf "%s\n" $path
/Users/arturo/.rvm/gems/ruby-1.9.3-p392/bin
/Users/arturo/.rvm/gems/ruby-1.9.3-p392@global/bin
/Users/arturo/.rvm/rubies/ruby-1.9.3-p392/bin
...
$ print -l $path
/Users/arturo/.rvm/gems/ruby-1.9.3-p392/bin
/Users/arturo/.rvm/gems/ruby-1.9.3-p392@global/bin
/Users/arturo/.rvm/rubies/ruby-1.9.3-p392/bin
...

<<<ผู้ประกอบการจะเรียกว่า herestrings ผู้ส่งข่าวออกไปทางด้านขวาของพวกเขาไปยังอินพุตมาตรฐานของคำสั่งทางด้านซ้าย

$ cat <<< 'Hello there'
Hello there

หากเปลือกของคุณไม่รองรับให้ใช้echoและไปป์

$ echo 'Hello there' | cat
Hello there

2
ที่น่าสนใจในการใช้สตริงที่นี่ฉันจะทำต่อไปนี้echo $PATH | tr ':' '\n'แต่ชัดเจนกว่าการแก้ปัญหาของคุณ
Arturo Herrero

1
ฉันเพิ่มคำตอบของฉันเล็กน้อยเพื่ออธิบายการใช้ herestrings ให้กับผู้คนที่เดินผ่านไปมา

ใน zsh print -l $pathบันทึกการกดแป้นบางครั้ง มันล้มเหลวถ้า$pathมีแบ็กสแลช แต่มันผิดปกติอย่างมาก
Gilles 'หยุดความชั่วร้าย'

$PATHทราบว่าบางส่วนของผู้ที่จะล้มเหลวในการแสดงรายการที่ว่างเปล่าใน
Stéphane Chazelas

@ StephanChazelas: ฉันไม่เคยคิดเกี่ยวกับเรื่องนี้ สองรายการแรกแสดงรายการที่ว่างเปล่า zsh-only ที่ไม่มี

4

นี่เป็นวิธีที่รวดเร็วด้วย bash

OLDIFS=$IFS IFS=: arr=($PATH) IFS=$OLDIFS
printf "%s\n" "${arr[@]}"

4
คุณสามารถหลีกเลี่ยงการบันทึก / กู้คืนIFSโดยใช้ subshell เช่น(IFS=: arr=($PATH); printf "%s\n" "${arr[@]})")
Nick

1
ที่ยังจะล้มเหลวในการแสดงรายการว่างเปล่าในเปลือกหอยมากที่สุดถ้ามันเป็นที่ผ่านมา ( /bin:/usr/bin:ใช้เป็นค่าทั่วไปสำหรับ$PATH)
Stéphane Chazelas

ในสามารถล้มเหลวหาก$PATHมีอักขระตัวแทน (ไม่น่า)
Stéphane Chazelas

ตามที่คุณระบุไว้bashคุณสามารถใช้IFS=: read -a arr <<< "$PATH"เป็นส่วนแยกได้ IFSค่าใหม่ด้วยวิธีนี้จะถูกใช้เฉพาะในขณะดำเนินการreadดังนั้นจึงไม่จำเป็นต้องกู้คืน pastebin.com/7E7C4AcR
จัดการ

ขอบคุณทุกคำติชม @ manatwork คุณรู้ไหมว่าทำไมIFSค่าใหม่ยังคงอยู่หลังจากการสร้างอาร์เรย์ แต่ไม่ใช่หลังจากดำเนินการread?
iruvar


1

โปรดทราบว่า PATH ที่ไม่ได้ตั้งค่ามีความหมายแตกต่างจาก PATH ที่ว่างเปล่า PATH ที่ว่างเปล่ามีองค์ประกอบที่ว่างเปล่าหนึ่งรายการและนั่นหมายถึงการค้นหาไฟล์ที่เรียกใช้งานในไดเรกทอรีปัจจุบันเท่านั้น PATH ที่ไม่ได้ตั้งค่าหมายถึงการค้นหาไฟล์ที่เรียกใช้ในรายการเริ่มต้นของไดเรกทอรี (แต่โปรดทราบว่าในบางระบบ รายการนั้น)

ในzsh:

if (($+PATH)); then
  echo "$#path element(s):"
  printf '%q\n' "$path[@]"
else
  echo "PATH unset"
fi

ใน POSIX shells (โปรดทราบว่าzshแม้ในshโหมดไม่ POSIX ในเรื่องนั้น):

if [ -n "${PATH+.}" ]; then
  (
    p=$PATH:
    set -f
    IFS=:
    set -- $p
    echo "$# element(s):"
    printf '"%s"\n' "$@"
  )
else
  echo "PATH unset"
fi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.