พฤติกรรมแปลก ๆ ใน $ (dirname `readlink -f $ 0`)


11

เมื่อฉันเรียกใช้สิ่งต่อไปนี้ในฐานะผู้ใช้ทั่วไปทุกอย่างใช้ได้ดี:

$(dirname `readlink -f $0`)

แต่หลังจากฉันเปลี่ยนเป็นรูทแล้วเกิดข้อผิดพลาดต่อไปนี้:

readlink: invalid option -- 'b'
Try `readlink --help' for more information.
dirname: missing operand
Try `dirname --help' for more information.

ความคิดใด ๆ ฉันลอง Fedora 16 และ Amazon EC2 ในพื้นที่ทั้งคู่กำลังใช้เชลล์ bash

แก้ไขสำหรับภาพประกอบ

ขออภัยที่ฉันไม่ได้อธิบายปัญหาเพิ่มเติมที่นี่ นี่คือสถานการณ์:

ใช้บัญชีผู้ใช้ปกติ:

$ pwd 
/home/myuser 
$ export MY_DIR=$(dirname `readlink -f $0`) 
$ echo MY_DIR 
/home/myuser

ใช้ราก:

# pwd
/root
# export ROOT_DIR=$(dirname `readlink -f $0`)
readlink: invalid option -- 'b'
Try `readlink --help' for more information.
dirname: missing operand
Try `dirname --help' for more information.

# export ROOT_DIR=echo $(dirname `readlink -f -- $0`)
# echo $ROOT_DIR
/root

คำตอบ:


16

สิ่งนี้ควรเป็นข้อผิดพลาดเดียวกับในเชลล์ล็อกอินของผู้ใช้เนื่องจากในเชลล์ล็อกอิน0พารามิเตอร์พารามิเตอร์ขยายเป็นชื่อของกระบวนการปัจจุบันให้-bashลบเครื่องหมายระบุเชลล์ล็อกอิน ตอนนี้คุณจะเห็นว่า-bข้อผิดพลาดมาจากไหน

ลองแทน

echo "$( dirname "$(readlink -f -- "$0")" )"

อะไร--( "ลบลบ" หรือ "รีบ") แสดงให้เห็น? ไม่เป็นไร - ฉันพบคำตอบได้ที่นี่: /unix//q/11376
osullic

3

หากคุณต้องการชื่อไดเรกทอรีของเชลล์สคริปต์ที่กำลังทำงานอยู่:

script_dir="$(dirname -- "$(readlink -f -- "$0")")"

ใช่มันค่อนข้างวุ่นวาย แต่ก็ปลอดภัย

หากคุณต้องการเปลือกปัจจุบันคุณสามารถลอง @ ข้อเสนอแนะ MichaelMrozek $SHELLของใช้

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