ฉันต้องการได้รับ dir บ้านของผู้ใช้ใด ๆ ด้วยเสียงสะท้อน
echo ~puchuu
>> /home/puchuu
แต่ฉันไม่สามารถใช้ตัวแปร
echo ~$USER
>> ~puchuu
echo `echo ~$USER`
>> ~puchuu
ฉันต้องการได้รับ dir บ้านของผู้ใช้ใด ๆ ด้วยเสียงสะท้อน
echo ~puchuu
>> /home/puchuu
แต่ฉันไม่สามารถใช้ตัวแปร
echo ~$USER
>> ~puchuu
echo `echo ~$USER`
>> ~puchuu
คำตอบ:
eval echo "~$USER"
ทำการสันนิษฐานว่า$USER
ไม่มีอักขระพิเศษที่เชลล์อาจตีความ ตัวอย่างเช่นถ้าUSER="foo\$bar"
เมื่อเราeval
เชลล์จะแทนที่$bar
เอาต์พุตของคุณซึ่งไม่ใช่สิ่งที่คุณต้องการ โดยทั่วไปถ้าคุณใช้เส้นทางนี้คุณต้องตรวจสอบให้แน่ใจว่า$USER
มีการป้อนข้อมูลที่มีสติ ส่วนใหญ่เวลาที่มันอาจจะเป็น แต่คุณควรคำนึงถึงเรื่องนี้
สิ่งนี้อาจใช้ได้กับคุณ:
homedir=$( getent passwd "$USER" | cut -d: -f6 )
สิ่งนี้จะทำงานกับผู้ใช้ที่ไม่ใช่คุณ ตัวอย่างเช่น
homedir=$( getent passwd "someotheruser" | cut -d: -f6 )
getenv
มากกว่าการสันนิษฐานว่าสถานที่ตั้งของpasswd
แม้จะเป็นขั้นตอนต่อไปมากกว่าที่จะสมมติตำแหน่งของบ้านคือ/home/
ดูเหมือนว่าคุณเป็นผู้ใช้รายนั้น - ทำไมไม่
echo $HOME
?
ฉันไม่รู้ว่ามันช่วยได้หรือไม่ แต่การวางเครื่องหมายตัวหนอนนอกนิพจน์นั้นใช้กับ ZSH แต่ไม่ใช่ใน Bash:
echo ~`echo $USER`
เมื่อคุณลงชื่อเข้าใช้cd
ให้ไปที่ไดเรกทอรีหลักของคุณจากนั้นเรียกใช้pwd
เพื่อพิมพ์ไดเรกทอรีทำงาน
echo $HOME
นอกจากนี้คุณยังคิดถึงวิธีการที่ง่ายมากซึ่งเป็นเพียง
echo ~$username
มันก็โอเค แต่ใน sh eval เป็นสิ่งจำเป็นหากเป็นตัวแปร