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/...