TL; DR: คุณสามารถใช้sudo -iเพื่อเรียกใช้ฟังก์ชันที่กำหนดไว้/root/.bashrc(แต่ไม่ใช่นามแฝง) และมีการเข้าถึงตัวแปรที่ส่งออกจากไฟล์นั้น:
อาร์กิวเมนต์คำสั่ง sudo -i
นามแฝงไม่ได้ทำงานที่นั่นว่า sudo -iแต่คุณสามารถแปลงให้เป็นฟังก์ชั่นหากคุณต้องการที่จะทำให้พวกเขามีให้
อ่านต่อไปเพื่อการวิเคราะห์ที่สมบูรณ์และรายละเอียดเพิ่มเติม
มีปัญหาเล็กน้อยที่นี่บางอย่างเกี่ยวกับวิธีการทำงานของ sudo และบางวิธีในการทุบตีทำงาน ...
ตามค่าเริ่มต้นsudoจะค้นหาเฉพาะคำสั่งและจะข้ามเชลล์ดังนั้นการเรียกใช้sudo llจะใช้งานได้ก็ต่อเมื่อมีllไฟล์ปฏิบัติการในไดเรกทอรีใดไดเรกทอรี$PATHหนึ่ง ดังนั้นเพื่อที่จะใช้นามแฝง (หรือฟังก์ชั่น) คุณจะต้องตรวจสอบให้แน่ใจว่าเชลล์ถูกเรียกใช้เป็นส่วนหนึ่งของกระบวนการ
วิธีหนึ่งที่จะใช้งานบางอย่างเช่นsudo shหรือsudo bashทันสมัยsudo(ฉันกำลังทดสอบนี้ใน sudo 1.8.19p1) มีตัวเลือก-sและ-iเพื่อจุดประสงค์นั้น
ดังนั้นหนึ่งลองจะเป็นสิ่งที่ชอบsudo -s ll(ซึ่งเทียบเท่ากับsudo bash -c 'll'สมมติว่าคุณ$SHELLเป็นทุบตีซึ่งดูเหมือนจะเป็นกรณีตามที่rcfileคุณกล่าวถึง) แต่นั่นก็ไม่ได้ผลเช่นกันเพราะมันเริ่มเปลือกในแบบไม่โต้ตอบ โหมดที่ไม่ใช่การเข้าสู่ระบบซึ่งไม่ได้อ่านไฟล์เริ่มต้นใด ๆ มันเหมือนกับว่าคุณเขียนเชลล์สคริปและใช้#!/bin/bashเพื่อรันมัน นามแฝง (และฟังก์ชั่น) ที่คุณมีในตัวคุณ~/.bashrcจะไม่สามารถเข้าถึงได้จากสคริปต์นั้น ...
ดังนั้นถัดไปคือ-iตัวเลือกซึ่งสร้างเชลล์การเข้าสู่ระบบ มันมีแนวโน้มมากกว่าเพราะมันจะอ่านไฟล์เริ่มต้นของคุณ! และยังsudo -i ll(เทียบเท่าsudo bash -l -c 'll') จะยังไม่ทำงาน ดังนั้นเป็นไปได้อย่างไรเพราะมันได้อ่านคำจำกัดความของllนามแฝง?
คำอธิบายต่อไปของที่นี่คือโดยค่าเริ่มต้นแล้วทุบตีจะไม่ขยายนามแฝงยกเว้นเมื่อเปลือกเป็นแบบโต้ตอบ ... เปลือกนี้เริ่มต้นด้วยsudo -i(หรือbash -l) เป็นเปลือกเข้าสู่ระบบแต่ยังไม่โต้ตอบ
ดังนั้นขั้นตอนต่อไปคือการได้รับshell แบบโต้ตอบซึ่งใช้งานได้ :
sudo bash -i -c 'll'
(การมีทั้งล็อกอินและอินเทอร์แอคทีฟก็bash -l -i -c ...ใช้ได้เช่นกัน)
อีกทางเลือกหนึ่งคือการใช้งานเชลล์การเข้าสู่ระบบ (ไม่ใช่แบบโต้ตอบ) แต่ขอให้ขยายนามแฝงอย่างชัดเจนดังนั้นสิ่งนี้จะได้ผล:
sudo bash -l -O expand_aliases -c 'll'
(กรณีที่ bash เป็นแบบอินเทอร์แอคทีฟไม่จำเป็นต้องมีเชลล์การเข้าสู่ระบบเนื่องจากนั่นเพียงพอที่จะอ่านไฟล์การกำหนดค่าเริ่มต้นได้ แต่สิ่งนี้จำเป็นต้อง-lอ่านไฟล์เหล่านั้น)
นี่เป็นบรรทัดคำสั่งที่ค่อนข้างยาว ... และพวกเขายังต้องการให้คุณอ้างอิงคำสั่งเชลล์ทั้งหมดดังนั้นหากคุณกำลังเรียกนามแฝงที่มีข้อโต้แย้งคุณจะต้องเปลี่ยนสิ่งนั้นให้เป็นสตริง ... ดังนั้นมันจึงเป็น เงอะงะที่จะใช้ ...
โปรดทราบว่าก่อนหน้านี้ฉันกำลังพูดถึงนามแฝงและฟังก์ชั่น ... นั่นเป็นไปตามวัตถุประสงค์เนื่องจากฟังก์ชั่นนั้นสะดวกกว่า คุณไม่ต้องการอะไรเป็นพิเศษ (เช่นมีเชลล์เชิงโต้ตอบหรือการตั้งค่าตัวเลือกเฉพาะ) เพื่อเรียกใช้งานฟังก์ชันบนเชลล์ตราบใดที่คุณกำลังหาคำจำกัดความของพวกเขา
ดังนั้นหากคุณกำหนดllเป็นฟังก์ชั่นแทนนามแฝงคุณจะสามารถใช้งานได้โดยตรงด้วย-iทางลัดของ sudo :
sudo -i ll
และถ้าคุณมีบรรทัดคำสั่งที่ยาวกว่าพร้อมด้วยอาร์กิวเมนต์คุณสามารถส่งต่อได้โดยตรงที่นี่เช่นกัน:
sudo -i ll -C -R /etc
(เปรียบเทียบกับsudo bash -i -c 'll -C -R /etc'.)
ฟังก์ชั่นยังมีความยืดหยุ่นมากกว่าและง่ายต่อการบำรุงรักษา ... โดยทั่วไปแล้วมันง่ายที่จะเปลี่ยนนามแฝงเป็นฟังก์ชั่นคำเตือนเพียงอย่างเดียวก็คือใช้ใน"$@"ที่ที่คุณคาดหวังว่าจะมีการโต้แย้งพิเศษเพิ่มเติม นามแฝง.)
ตัวอย่างเช่นนามแฝงนี้:
alias ll='ls $LS_OPTIONS -l'
สามารถเปลี่ยนเป็นฟังก์ชั่นนี้ได้:
ll () {
ls $LS_OPTIONS -l "$@"
}
พวกเขาเพื่อจุดประสงค์ส่วนใหญ่เทียบเท่า และตามที่กล่าวไว้ก่อนหน้านี้ฟังก์ชั่นควรจะสามารถเข้าถึงได้โดยตรงจากsudo -iเพื่อให้เป็นโบนัสเพิ่ม
ฉันหวังว่าคุณจะพบคำตอบและคำอธิบายนี้เป็นประโยชน์!
/root/.bashrcแต่จริงๆสิ่งที่ถามคือหลังจากที่เป็นชื่อแทนจากไฟล์นี้ - นี้เป็นไปไม่ได้ต่อนี้ - unix.stackexchange.com/questions/1496/...