บรรทัดสุดท้ายของฉัน.bash_profile
คือ:
alias cp=/usr/local/bin/gcp
อย่างไรก็ตามที่ถูกแบนโดยรายการในของฉัน$PATH
:
$which cp
/bin/cp
11:54:32/OCspark $type cp
cp is aliased to `/usr/local/bin/gcp'
ฉันคิดว่านามแฝงจะแทนที่PATH
.. ?
บรรทัดสุดท้ายของฉัน.bash_profile
คือ:
alias cp=/usr/local/bin/gcp
อย่างไรก็ตามที่ถูกแบนโดยรายการในของฉัน$PATH
:
$which cp
/bin/cp
11:54:32/OCspark $type cp
cp is aliased to `/usr/local/bin/gcp'
ฉันคิดว่านามแฝงจะแทนที่PATH
.. ?
คำตอบ:
which
คำสั่งส่งกลับเพียง executables: มันรู้อะไรเกี่ยวกับชื่อแทนเพราะมันเป็นโปรแกรมภายนอกและมีกลไกสำหรับการส่งผ่านข้อมูลไปยังนามแฝงกระบวนการเด็กไม่มี
หากคุณป้อนคำสั่งtype -a cp
คุณจะเห็นการตีความที่เป็นไปได้ทั้งหมดตามลำดับที่ต้องการ ซึ่งรวมถึงนามแฝงใด ๆ เนื่องจากtype
เป็นbash
คำสั่งภายใน
สิ่งสำคัญคือต้องตระหนักว่านามแฝงจะไม่ถูกตีความโดยกระบวนการย่อยเช่นสคริปต์หรือตัวแก้ไขเชิงโต้ตอบซึ่งมีตัวเลือกในการเรียกใช้คำสั่งระบบ
หากคุณสร้างcp
ฟังก์ชั่นเวอร์ชั่นของคุณจะทำงานในสคริปต์ แต่ไม่ใช่จากโปรแกรมอื่น:
cp() { /usr/local/bin/gcp "$@"; }
หากคุณต้องการcp
ทำงานทุกที่ให้เพิ่ม$HOME/bin
ที่หัวPATH
รายการแล้วชี้$HOME/bin/cp
ไปที่:
ln -s /usr/local/bin/gcp $HOME/bin/cp
สิ่งนี้ทำให้ลิงก์สัญลักษณ์แม้ว่าคุณสามารถทำให้เป็นฮาร์ดลิงก์ที่มีประสิทธิภาพมากกว่าเล็กน้อย (ละเว้น-s
) แต่โดยปกติจะต้องได้รับอนุญาตรูท ( sudo ln ...
) การสร้างฟังก์ชั่นและการเพิ่มPATH
ตัวแปรจะทำในหนึ่งในbash
สคริปต์เริ่มต้นพร้อมสิทธิ์ผู้ใช้
which
ทำงานที่/usr/bin/which
มีอินพุต pip จากการส่งออกของalias
และตัวเลือกที่บอกให้อ่านอินพุตนั้นและใช้เพื่อแสดงชื่อแทนถ้าตรงกับ คำสั่ง ดูunix.stackexchange.com/questions/10525/ …
which
type
จากนั้นwhich -a
ดำเนินการเช่นโปรแกรมภายนอกโดยเพิ่ม alias และนิยามฟังก์ชัน โดยทั่วไปแล้วฉันทำไม่ได้alias which=type
เพราะฉันชอบที่จะใช้$(which ProgName)
เมื่อฉันต้องการบังคับให้ใช้โปรแกรมภายนอกโดยข้ามนามแฝงหรือนิยามฟังก์ชันใด ๆ
ln
/usr/local/bin
มันจะทำงานผิดปกติหากคุณอัปเดตgcp
เนื่องจากลิงก์ถาวรของคุณอาจยังอ้างอิงถึงเวอร์ชันเก่า
gcp
นั้นจะขึ้นอยู่กับว่าการอัปเดตนั้นกระทำโดยเปิดและเขียนหรือโดยการลบและสร้างใหม่อีกครั้ง โปรดทราบว่ามันไม่สำคัญว่าจะใช้พา ธ แหล่งที่มาแบบสัมบูรณ์หรือสัมพัทธ์เพื่อสร้างฮาร์ดลิงก์ในขณะที่ลิงก์สัญลักษณ์มักต้องการพา ธ สัมบูรณ์ ลิงค์ถูกใช้อย่างกว้างขวางในระบบปฏิบัติการและส่วนใหญ่เป็นสัญลักษณ์
นามแฝงอยู่ภายในเชลล์ โปรแกรมอื่น ๆ จะไม่ทราบเกี่ยวกับพวกเขา
which
ไม่ใช่ Bash builtin (มันเป็น builtin ในเชลล์อื่น ๆ เช่น zsh) เนื่องจากwhich
ไม่มีข้อมูลที่เป็นเอกสิทธิ์ในนามแฝงของ Bash which
เพียงแค่ค้นหาPATH
คำที่กำหนด
type
ในทางกลับกันคือ Bash builtin ดังนั้นจึงสามารถรายงานชื่อแทนได้
PATH
envar