Bash: ใช้นามแฝงในตัวแปร


9

ฉันกำลังเขียนสคริปต์ทุบตีที่เรียกใช้อาร์กิวเมนต์แต่ละตัวเป็นคำสั่ง สิ่งนี้ใช้ได้กับคำสั่งในของฉันPATHแต่ไม่ใช่สำหรับนามแฝง ฉันสามารถเรียกนามแฝงในสคริปต์โดยตรง แต่ฉันไม่สามารถเรียกนามแฝงที่ถูกส่งผ่านเป็นอาร์กิวเมนต์ได้

ปัญหา (ฉันถือว่า) เป็นนามแฝงที่จะขยายก่อนตัวแปร มีวิธีเรียกใช้นามแฝงจากตัวแปรหรือไม่?

สคริปต์ตัวอย่าง:

#!/bin/bash
# File: runall

shopt -s expand_aliases
source ~/.aliases

while (( "$#" )); do
    $1
    shift
done

runall "echo test"ทำงานได้ แต่runall "myalias"ให้runall: line 8: myalias: command not found

คำตอบ:


9

หลังจากการทดสอบฉันได้ข้อสรุปดังต่อไปนี้:

  • ชื่อแทนจะทำงานในโหมดโต้ตอบเท่านั้น (เพิ่ม-iไปยัง shebang)
  • นามแฝงจะไม่ได้รับการประเมินเมื่อพวกเขามาจากแหล่งตีความ (ในกรณีนี้คือตัวแปร
  • eval $1คุณจะได้รับการทุบตีใช้นามแฝงที่มี โปรดทราบว่าการevalทำสิ่งใดก็ตามที่สร้างขึ้นด้วยตัวแปรนั้นมีอันตราย แต่เนื่องจากจุดทั้งหมดของสคริปต์ต้องการการดำเนินการโดยพลการฉันจะไม่ทำเรื่องใหญ่เกินไป

จากหน้าคนทุบตี:

นามแฝงจะไม่ถูกขยายเมื่อเชลล์ไม่สามารถใช้งานได้เว้นแต่ว่าตัวเลือกเชลล์ expand_aliases จะถูกตั้งค่าโดยใช้ shopt (ดูคำอธิบายของ shopt ภายใต้คำสั่ง SHELL BUILTIN ด้านล่าง)

เพื่อให้คุณสามารถเพิ่มแทนshopt -s expand_aliases-i

นอกจากนี้

นามแฝงจะถูกขยายเมื่อคำสั่งถูกอ่านไม่ใช่เมื่อถูกเรียกใช้งาน

เนื่องจากตัวแปรจะไม่ถูกขยายก่อนที่จะอ่านคำสั่งพวกเขาจะไม่ถูกขยายเพิ่มเติมโดยใช้นามแฝง


1
ดีที่รู้. เพิ่งเกิดจากความอยากรู้: ทำไมจึงเป็นอันตรายต่อevalตัวแปร

1
@hesse eval "echo $1"พิจารณา ./script.sh "hello;rm -rf ~บอกว่าผมโทร อะไรที่ถูกประหารชีวิต? ตามมาด้วยecho hello rm -rf ~เห็นได้ชัดว่าเป็นตัวอย่างที่วางแผนไว้ แต่มีหลักการ
เควิน

เพิ่มevalในหน้าของการทำงานตั้งแต่ฉันได้แล้ว$1 shopt -s expand_aliasesขอบคุณ!
Jayson

1

ฉันมีปัญหาที่คล้ายกันและจัดการเพื่อแก้ไขปัญหาของฉันโดยการเปลี่ยนนามแฝงของฉันไปใช้ฟังก์ชั่นตามที่อธิบายไว้ในเว็บไซต์นี้ซึ่งทำงานให้ฉัน

เช่น

alias lsd="ls -lash"

ถึง

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