วิธีการส่งผ่านอาร์กิวเมนต์บรรทัดคำสั่งไปยังนามแฝงของเปลือก?


288

ฉันจะส่งผ่านอาร์กิวเมนต์บรรทัดคำสั่งไปยังนามแฝงได้อย่างไร นี่คือตัวอย่าง:

alias mkcd = 'mkdir $ 1; cd $ 1; '

แต่ในกรณีนี้ $ xx กำลังได้รับการแปล ณ เวลาที่สร้างนามแฝงไม่ใช่เวลารันไทม์ อย่างไรก็ตามฉันได้สร้างวิธีแก้ปัญหาโดยใช้ฟังก์ชั่นเชลล์ (หลังจาก googling เล็กน้อย) ดังนี้:

ฟังก์ชั่น mkcd () {
  mkdir $ 1
  cd $ 1
}

แค่อยากรู้ว่ามีวิธีสร้างนามแฝงที่ยอมรับพารามิเตอร์ CL หรือไม่
BTW - ฉันใช้ 'bash' เป็นเชลล์เริ่มต้นของฉัน



2
O / T แต่เป็นทางเลือกแทนการทำฟังก์ชั่น mkcd คุณสามารถเขียนmkdir mydirectoryname && cd $_
moala

คำตอบ:


174

คุณพบวิธี: สร้างฟังก์ชั่นแทนนามแฝง C เชลล์มีกลไกสำหรับการทำอาร์กิวเมนต์ให้กับสมนาม แต่ bash และ Korn เชลล์ไม่ได้เนื่องจากกลไกการทำงานมีความยืดหยุ่นมากกว่าและมีความสามารถเดียวกัน


อย่างไรก็ตามคุณไม่จำเป็นต้องใช้ฟังก์ชั่นเมื่อสร้างนามแฝงใน.bashrcไฟล์ ตัวอย่างเช่น # สร้างนามแฝงที่รับหมายเลขพอร์ตโดยนามแฝงผู้ใช้บริการ = "python -m SimpleHTTPServer $ 1" หลังจากทำการเปลี่ยนแปลงในไฟล์. bashrc ตรวจสอบให้แน่ใจว่าคุณป้อนคำสั่งต่อไปนี้ ~ $ source .bashrc คุณควรจะใช้สิ่งนี้เช่นนี้ ~ $ เสิร์ฟ 8998
kaizer1v

8
@ kaizer1v, การสังเกตของฉันเกี่ยวกับ CentOS7.3 bash เวอร์ชั่น 4.2.46 คือข้อเสนอแนะของคุณไม่ทำงานอย่างที่คุณคิด เนื่องจากคุณใช้เครื่องหมายอัญประกาศคู่จริง ๆ แล้ว $ 1 จะถูกประเมินเป็นสตริงว่างเปล่าและนามแฝงนั้นก็เหมือนกับ alias เสิร์ฟ = "python -m SimpleHTTPServer" และสิ่งใดก็ตามที่คุณผ่านหลังจากนามแฝงนั้นก็คือ ALSO บนบรรทัดคำสั่ง หากคุณลองชุดนี้ -x; alias เสิร์ฟ = "python -m SimpleHTTPServer $ 1 &" คุณจะเห็นข้อผิดพลาด / ปัญหา ทั้งอาร์กิวเมนต์และคำสั่ง alias ของคุณจะรันเป็นคำสั่งแยกกัน
PatS

279

เพียงเพื่อย้ำสิ่งที่โพสต์สำหรับเชลล์อื่น ๆ ในBashทำงานต่อไปนี้:

alias blah='function _blah(){ echo "First: $1"; echo "Second: $2"; };_blah'

ใช้งานต่อไปนี้:

blah one two

ให้ผลลัพธ์ด้านล่าง:

First: one
Second: two

4
ทางออกที่ดี บางคำถามจาก bash สามเณร: ฟังก์ชั่นจะต้องตั้งชื่อด้วยการขีดเส้นใต้ (หรือแตกต่างกันเลย) หรือว่าเป็นเพียงสำหรับการอ่าน? จุดประสงค์ของการติดตาม "; _blah" ในการกำหนดฟังก์ชั่นคืออะไร? ทำไมมันไม่ทำงานเมื่อใช้เครื่องหมายคำพูดคู่แทนราคาเดียว ($ 1 ไม่ถูกตีความอย่างถูกต้อง) แม้ว่าจะทำบางสิ่งที่ไม่ต้องการราคาประมาณ $ 1? ขอบคุณล่วงหน้าสำหรับคำแนะนำ ฉันมีวิธีแก้ปัญหาการทำงาน แต่มักจะต้องการเข้าใจเพิ่มเติมว่าทำไมมันทำงาน
mynameispaulie

4
@mynameispaulie ฟังก์ชันสามารถตั้งชื่ออะไรก็ได้ ผมเคยใช้คำนำหน้าขีดมันเป็นเคล็ดลับร่วมกันเพื่อช่วยป้องกันการชนชื่อ (เช่นฟังก์ชั่นอื่นที่มีชื่อเดียวกัน)
โทมัสแบรต

6
@mynameispaulie เครื่องหมายอัญประกาศคู่อนุญาตให้Bashแทนที่$1และ$2ด้วยพารามิเตอร์ที่ส่งผ่านไปยังฟังก์ชัน คำพูดเดี่ยวบอก Bash ไม่ให้ทำ
Thomas Bratt

5
ฉันเห็นนามแฝง / ฟังก์ชันคอมโบคัดลอก / วางมาก แต่ดูเหมือนว่าจะไม่มีประโยชน์อะไร แนวทางมาตรฐานคือการกำหนดฟังก์ชั่นหนึ่งครั้งด้วยชื่อที่มีสติและไม่มีนามแฝง
tripleee

16
ฉันล้มเหลวที่จะดูว่าสิ่งนี้เป็นที่ต้องการมากกว่าfunction blah(){ echo "First: $1"; echo "Second: $2"; }
René Nyffenegger

57

คุณไม่สามารถอยู่ใน ksh ได้ แต่คุณสามารถเป็น csh

alias mkcd 'mkdir \!^; cd \!^1'

ใน ksh ฟังก์ชั่นเป็นวิธีที่จะไป แต่ถ้าคุณต้องการใช้นามแฝงจริงๆ:

alias mkcd='_(){ mkdir $1; cd $1; }; _'

ในฐานะที่เป็นบันทึกย่อที่น่าสนใจฉันคิดว่าช่องโหว่ในการเรียกใช้รหัสระยะไกลที่ทุกคนพูดถึงเมื่อเร็ว ๆ นี้เกี่ยวข้องกับการทำสิ่งเดียวกันเกือบทั้งหมด แต่ในตัวแปรสภาพแวดล้อมที่ถูกกำหนดโดยผู้ใช้ดิบ openwall.com/lists/oss-security/2014/09/24/11
Floegipoky

@Floegipoky - เพราะมันอยู่ในนามแฝงและไม่ใช่ env var มันต่างกันมาก ปัญหา ShellShock คือมันทำงานเมื่อตั้งค่า env var การตั้งค่า env var ควรเป็นการดำเนินการที่ปลอดภัย ไม่มีสคริปต์ดำเนินการเมื่อตั้งชื่อแทนข้างต้นเฉพาะเมื่อเรียกใช้นามแฝงแล้ว
Sanjaya R

บางทีมันควรจะชี้ให้เห็นว่าcshโดยปกติแล้วไม่ใช่สิ่งที่คนทันสมัยควรต้องการใช้ นามแฝงซึ่งสร้าง -a- ฟังก์ชั่นแล้ว - ดำเนินการ - ฟังก์ชั่นที่เป็นที่นิยมค่อนข้าง แต่ไม่ได้รับประโยชน์มากกว่าฟังก์ชั่นที่เหมาะสมเท่าที่ฉันสามารถบอกได้ (ฟังก์ชั่นควรอ้างอิงอาร์กิวเมนต์อย่างถูกต้องแล้ว) Downvoting
tripleee

17

ในการอ้างอิงหน้าคนทุบตี:

ไม่มีกลไกสำหรับใช้อาร์กิวเมนต์ในข้อความแทนที่ หากจำเป็นต้องมีอาร์กิวเมนต์ควรใช้ฟังก์ชั่นเชลล์ (ดู FUNCTIONS ด้านล่าง)

ดูเหมือนว่าคุณตอบคำถามของคุณเอง - ใช้ฟังก์ชั่นแทนนามแฝง



5

ฉันพบว่าฟังก์ชั่นไม่สามารถเขียนได้ ~/.cshrcไฟล์ได้ ในนามแฝงซึ่งใช้อาร์กิวเมนต์

ตัวอย่างเช่นอาร์กิวเมนต์ส่งผ่านไปยังคำสั่ง 'find'

alias fl "find . -name '\!:1'"     
Ex: >fl abc

โดยที่ abc คืออาร์กิวเมนต์ที่ส่งเป็น!: 1


4
ไม่เป็นประโยชน์สำหรับ OP ซึ่งเชลล์เริ่มต้นเป็น bash และคำตอบของ Sanjaya R พูดถึงนามแฝงของ csh เมื่อ 4 ปีก่อน
Keith Thompson

1
คำตอบของ Sanjaya R ไม่ได้อธิบาย!:1ความหมาย ฉันต้องเลื่อนลงเพื่อดูที่นี่ว่ามันเป็นข้อโต้แย้ง คำตอบที่ดีไม่ได้ทิ้งคำถามไว้มากมายแม้ว่ามันจะไม่เหมาะสำหรับเชลล์ประเภท OPs
searchengine27

4

วิธีที่ง่ายที่สุดคือการใช้ฟังก์ชั่นไม่ใช่นามแฝง คุณยังสามารถเรียกใช้ฟังก์ชันได้ตลอดเวลาจาก cli ใน bash คุณสามารถเพิ่มชื่อฟังก์ชั่น () {คำสั่ง} มันโหลดเช่นเดียวกับนามแฝง

function mkcd() { mkdir $1; cd $1 ;}

ไม่แน่ใจเกี่ยวกับหอยอื่น ๆ


2

คุณไม่สามารถทำสิ่งที่คุณต้องการได้ด้วย Bash aliases เนื่องจาก aliases นั้นเป็นแบบสแตติก ให้ใช้ฟังก์ชั่นที่คุณสร้างขึ้นแทน

ดูที่นี่สำหรับข้อมูลเพิ่มเติม: http://www.mactips.org/archives/2008/01/01/increase-productivity-with-bash-aliases-and-functions/ (ใช่ฉันรู้ว่ามันคือ mactips.org แต่เกี่ยวกับ Bash ดังนั้นไม่ต้องกังวล)


1

ใช้งานได้ใน ksh:

$ alias -x mkcd="mkdir \$dirname; cd \$dirname;"
$ alias mkcd
mkcd='mkdir $dirname; cd $dirname;'
$ dirname=aaa 
$ pwd
/tmp   
$ mkcd
$ pwd
/tmp/aaa

ตัวเลือก "-x" ทำให้นามแฝง "ส่งออก" - นามแฝงปรากฏใน subshells

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



-2

นี่คือฟังก์ชั่นตัวอย่างง่ายๆโดยใช้ python คุณสามารถติดใน ~ / .bashrc
คุณต้องมีช่องว่างหลังจากวงเล็บปีกกาซ้ายแรก
คำสั่ง python จำเป็นต้องอยู่ในเครื่องหมายคำพูดคู่เพื่อรับการแทนที่ตัวแปร
อย่าลืมเครื่องหมายอัฒภาคที่ท้าย

จำนวนฟังก์ชั่น () {python -c "สำหรับ num ใน xrange ($ 1): print num";}

$ count 6
0
1
2
3
4
5
$

-5

นามแฝงที่ว่างเปล่าจะดำเนินการ args:

alias DEBUG=

12
ฉันเห็นตัวแทนของคุณว่าคุณยังใหม่กับ SO (Stack Overflow) โปรดอย่าตกใจเมื่อลงคะแนนในคำตอบของคุณ มีการลงคะแนนเพราะไม่ได้ตอบคำถามที่ OP (โปสเตอร์ดั้งเดิม) ขอให้ตอบ แขวนในพวกเขาและพยายามต่อไป นอกจากนี้เมื่อตอบรับให้ลองใส่ตัวอย่างง่ายๆว่าคำตอบของคุณทำงานอย่างไรและแสดงผลลัพธ์ วิธีนี้จะช่วยให้ผู้อื่นเห็นว่าคำตอบของคุณทำงานอย่างไร
PatS
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.