บรรทัดสุดท้ายของฉัน.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 ดังนั้นจึงสามารถรายงานชื่อแทนได้
PATHenvar