ฉันจะสร้างสมนามเชลล์ได้อย่างไร?


12

ในของฉัน.profile(ที่มาในshโหมดการจำลองจากของฉัน.zshrc) ฉันมีตัวอย่างต่อไปนี้:

if [ -f /usr/bin/pacmatic ]; then
    alias pacman=pacmatic
fi

# Colorized Pacman output
alias pacman="pacman --color auto"

อย่างไรก็ตามนามแฝงที่สองจะแทนที่สิ่งแรกเสมอ:

% type pacman
pacman is an alias for pacman --color auto

ฉันจะทำอย่างไรเพื่อให้การมอบหมายนามแฝงที่สอง "สืบทอด" การมอบหมายครั้งแรกดังนั้นถ้า/usr/bin/pacmaticมีอยู่นามแฝงจะกลายเป็นpacmatic --color auto?

ฉันไม่รังเกียจที่จะใช้ฟังก์ชั่นแทนนามแฝง แต่ฉันต้องการมันถ้าตรรกะไม่ได้ถูกดำเนินการทุกครั้งที่pacmanถูกเรียกใช้ (ฉันต้องการpacmaticตรวจสอบหนึ่งครั้งเมื่อเริ่มต้นเชลล์ไม่ใช่ทุกครั้งที่pacmanทำงาน ฉันต้องการใช้shสคริปต์แบบพกพาด้วย แต่ถ้าไม่สามารถทำได้คุณสามารถใช้zshไวยากรณ์แบบเต็มได้

(ใช่ฉันรู้ว่าเรื่องนี้อาจจะได้รับการแก้ไขได้อย่างง่ายดายโดยการผนวก--color autoกับpacmaticนามแฝง. แต่ฉันต้องการที่จะทำทางขวา™.)

ฉันลองใช้ Google และค้นหา manpages แต่ก็ไม่มีประโยชน์


ฉันคิดว่าวิธีที่ถูกต้องคือการใช้ฟังก์ชั่นแทนนามแฝง ฉันได้ยินมาว่าพวกเขาเร็วกว่านามแฝง (อย่างน้อยในbash) และพวกเขาสามารถโทรหากันได้อย่างง่ายดาย
Wutaz

คำตอบ:


5

เชลล์aliasมีพฤติกรรมคล้ายกันกับ a #defineเช่นการกำหนดเชลล์นามแฝงใหม่จะแทนที่เชลล์ก่อนหน้า

ฉันไม่แน่ใจว่าสิ่งใดที่จะเป็น Right Way TMแต่วิธีการหนึ่งจะใช้ฟังก์ชั่นเชลล์ที่ยอมรับพารามิเตอร์และใช้สิ่งนั้นเพื่อสร้างนามแฝง ข้อมูลโค้ดของคุณสามารถเขียนใหม่เป็น:

if [ -f /usr/bin/pacmatic ]; then
    pacman() { pacmatic "$@"; }
fi

# Colorized Pacman output
alias pacman="pacman --color auto"

 


ยิ่งกว่านั้นแม้ว่าคุณจะใช้นามแฝงที่แตกต่างกันและพยายามที่จะใช้เพื่อกำหนดอีกอันหนึ่งก็จะไม่ทำงานเนื่องจากชื่อแทนจะไม่ได้รับการขยายในโหมดที่ไม่ใช่แบบโต้ตอบตามค่าเริ่มต้น คุณต้องเปิดใช้งานโดยการตั้งค่าexpand_aliases:

shopt -s expand_aliases

ข้อความจากคู่มือ:

   Aliases are not expanded when the shell is not interactive, unless  the
   expand_aliases  shell option is set using shopt (see the description of
   shopt under SHELL BUILTIN COMMANDS below).

สิ่งนี้ดูเหมือนจะใกล้เคียงกับสิ่งที่ฉันต้องการมากที่สุด แต่ก็ไม่ได้ผล type pacmanส่งคืนpacman is an alias for pacman --color autoทั้งในshโหมดอีมูเลชันและในzshโหมดเนทิฟ อย่างไรก็ตามดูเหมือนว่าการแก้ไขที่คุณเพิ่งทำคือสิ่งที่ฉันต้องการ
strugee

FWIW เทียบเท่า zsh setopt aliasesคือ
strugee

OP zshใช้ และเปลือกดูเหมือนจะเป็นแบบโต้ตอบต่อไป
Mikel

6

การทดแทนสมนามจะดำเนินการก็ต่อเมื่ออ่านบรรทัดจากแหล่งโต้ตอบ ดังนั้นนามแฝงที่สองจะไม่ได้รับผลกระทบจากครั้งแรกดังนั้นการแทนที่ที่แท้จริง

บางทีสิ่งที่คล้ายกัน:

PACMAN=pacman
if [ -f /usr/bin/pacmatic ]; then
    PACMAN=pacmatic
fi

# Colorized Pacman output
alias pacman="${PACMAN} --color auto"

สิ่งนี้จะตั้งค่า 'pacman' เป็นค่าที่เหมาะสมตัวแปร PACMAN env จะไม่ถูกส่งออกดังนั้นมันจะหายไปเมื่อสคริปต์เสร็จสิ้นและการใช้ "เครื่องหมายคำพูดคู่" จะช่วยให้มั่นใจว่าการแทนที่ตัวแปรเกิดขึ้นที่การประกาศนามแฝง ไม่ใช่สำหรับการร้องขอแต่ละครั้ง

ฉันใช้วิธีการที่คล้ายกัน:

PACMAN=pacman
which pacmatic &>/dev/null && PACMAN=pacmatic
alias pacman="${PACMAN} --color auto"

โดยทั่วไปตั้ง env var PACMAN ทดสอบ pacmatic ในเส้นทางถ้าพบตั้ง PACMAN แล้วกำหนดนามแฝง

อืมคุณสามารถเพิ่มประสิทธิภาพอีกเล็กน้อย ...

which pacmatic &>/dev/null && PACMAN=pacmatic
alias pacman="${PACMAN:-pacman} --color auto"

Taa Daa! ตั้งค่าเป็น 'pacman' หาก PACMAN ไม่ได้ตั้งค่าไว้หรือไม่เช่นนั้นให้ตั้งค่าเป็น PACMAN ตั้งเป็น pacmatic ตามบรรทัด 'ซึ่ง'


เหตุใดนามแฝงจะทำงานเฉพาะกับ "แหล่งข้อมูลแบบโต้ตอบ"
มิเคล

คุณถูกต้องแล้วโดยค่าเริ่มต้นbashจะไม่ขยายนามแฝงในโหมดที่ไม่ใช่แบบโต้ตอบ แต่สิ่งนี้จะเหมือนกับ "แหล่งโต้ตอบ" อย่างไร
มิเคล

2

ใน zsh คุณสามารถต่อท้ายนามแฝงได้อย่างง่ายดายโดยใช้aliasesอาร์เรย์ที่เชื่อมโยง:

alias pacman="${aliases[pacman]-pacman} --color auto"

ในเชลล์อื่นคุณต้องใช้เอาต์พุตของaliasคำสั่งเพื่อค้นหาเกี่ยวกับนามแฝงที่มีอยู่

current_pacman_alias=$(alias pacman 2>/dev/null)
alias pacman="${current_pacman_alias:-pacman} --color auto"

ในขณะที่ฉันกำลังเสนอสิ่งนี้เป็นไปได้ฉันจะใช้ตัวแปรตามคำแนะนำอื่น ๆ ที่แนะนำไปแล้ว มีความชัดเจนมากขึ้นและคุณสามารถแยกแยะมูลค่าของตัวแปรได้หากคุณต้องการกำหนดค่าบางอย่างแตกต่างกันโดยขึ้นอยู่กับว่ามีการใช้งานอันใดอันหนึ่งpacmaticหรือpacmanกำลังใช้งานอยู่

pacman==pacmatic 2>/dev/null || pacman=pacman
alias pacman='$pacman --color auto'


0
pacman() ( def_args="--color auto" bin=
    [ -x ${bin:=/usr/bin/pacmatic} ] || bin=
    [ -x ${bin:=/usr/bin/pacman} ] || bin= 
    ${bin:?WHERE THE HELL IS PACMAN????} \
        $def_args "$@"
)

นามแฝงสำหรับนก

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