คำถามติดแท็ก function

คำถามเกี่ยวกับการใช้ฟังก์ชั่นในบริบทของ Unix & Linux (ส่วนใหญ่ แต่ไม่เฉพาะเชลล์สคริปต์) ควรถามคำถามเกี่ยวกับการเขียนโปรแกรมใน Python, Perl, Ruby และอื่น ๆ ใน Stack Overflow

14
ใน Bash เมื่อนามแฝงเมื่อสคริปต์และเมื่อใดที่จะเขียนฟังก์ชั่น?
ฉันใช้งาน Linux มาเกือบ 10 ปีแล้วเพื่อถามคำถามนี้ มันเป็นการทดลองและข้อผิดพลาดทั้งหมดและการท่องอินเทอร์เน็ตแบบดึกดื่น แต่ผู้คนไม่ควรต้องการ 10 ปีสำหรับเรื่องนี้ ถ้าฉันเพิ่งเริ่มต้นด้วย Linux ฉันต้องการทราบว่าเมื่อใดจะใช้นามแฝงเวลาเขียนสคริปต์และเมื่อใดควรเขียนฟังก์ชัน ฉันใช้นามแฝงสำหรับการดำเนินการที่ง่ายมากที่ไม่มีข้อโต้แย้ง alias houston='cd /home/username/.scripts/' ดูเหมือนว่าชัดเจน แต่บางคนทำสิ่งนี้: alias command="bash bashscriptname" (และเพิ่มลงใน.bashrcไฟล์) มีเหตุผลที่ดีที่จะทำเช่นนั้น? ฉันพยายามอย่างหนักจริง ๆ แต่ฉันไม่สามารถนึกถึงสถานการณ์ใด ๆ ที่ฉันต้องการจะทำอย่างแท้จริง ดังนั้นหากมีกรณีขอบที่จะสร้างความแตกต่างโปรดตอบด้านล่าง เพราะนั่นคือสิ่งที่ฉันจะใส่บางสิ่งใน PATH ของฉันchmod +xซึ่งเป็นอีกสิ่งหนึ่งที่เกิดขึ้นหลังจากการทดลองและข้อผิดพลาดของ Linux มาหลายปี ซึ่งนำฉันไปยังหัวข้อถัดไป ตัวอย่างเช่นฉันเพิ่มโฟลเดอร์ที่ซ่อนอยู่ ( .scripts/) ในโฮมไดเร็กตอรี่ไปที่ PATH ของฉันโดยเพิ่มบรรทัดลงใน.bashrc( PATH=$PATH:/home/username/.scripts/) ของฉันดังนั้นสิ่งใดที่ปฏิบัติการได้ในการเติมข้อความอัตโนมัติโดยอัตโนมัติ ถ้าฉันต้องการ ฉันไม่ต้องการสิ่งนั้นจริง ๆ ใช่ไหม? ฉันจะใช้เฉพาะสำหรับภาษาที่ไม่ใช่เปลือกเช่น Python …

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

5
ความแตกต่างระหว่าง“ function foo () {}” และ“ foo () {}”
ฉันสามารถกำหนดbashฟังก์ชั่นการใช้หรือละเว้นfunctionคำหลักได้ มีความแตกต่างหรือไม่? #!/bin/bash function foo() { echo "foo" } bar() { echo "bar" } foo bar ทั้งการเรียกใช้ฟังก์ชันfooและbarประสบความสำเร็จและฉันไม่เห็นความแตกต่างเลย ดังนั้นฉันสงสัยว่ามันเป็นเพียงเพื่อปรับปรุงการอ่านหรือมีบางสิ่งที่ฉันขาดหายไป ... BTW ในเชลล์อื่น ๆ เช่นdash(เชื่อม/bin/shโยงกับdashเดเบียน / Ubuntu) มันล้มเหลวเมื่อใช้functionคำหลัก
96 bash  shell  function  posix 

8
ฉันสามารถ "ส่งออก" ฟังก์ชั่นในทุบตี?
source some_file some_file: doit () { echo doit $1 } export TEST=true ถ้าฉันแหล่งsome_fileฟังก์ชั่น "doit" และตัวแปรทดสอบมีอยู่ในบรรทัดคำสั่ง แต่ใช้สคริปต์นี้: script.sh: #/bin/sh echo $TEST doit test2 จะส่งคืนค่า TEST แต่จะสร้างข้อผิดพลาดเกี่ยวกับฟังก์ชันที่ไม่รู้จัก "doit" ฉันสามารถ "ส่งออก" ฟังก์ชั่นด้วยหรือฉันต้องมีแหล่ง some_file ใน script.sh เพื่อใช้ฟังก์ชั่นที่นั่นหรือไม่?
81 bash  function 

12
เหตุใดจึงต้องเขียนสคริปต์ทุบตีทั้งหมดในฟังก์ชั่น
ที่ทำงานฉันเขียนสคริปต์ทุบตีบ่อยๆ หัวหน้างานของฉันแนะนำว่าสคริปต์ทั้งหมดจะถูกแบ่งเป็นฟังก์ชั่นคล้ายกับตัวอย่างต่อไปนี้: #!/bin/bash # Configure variables declare_variables() { noun=geese count=three } # Announce something i_am_foo() { echo "I am foo" sleep 0.5 echo "hear me roar!" } # Tell a joke walk_into_bar() { echo "So these ${count} ${noun} walk into a bar..." } # Emulate a pendulum clock for a …

3
รีเฟรช alias และฟังก์ชั่นใหม่หลังจากกำหนด alias และฟังก์ชั่นใหม่หรือไม่?
เมื่อฉันกำหนดนามแฝงใหม่ใน.bash_aliasesไฟล์หรือฟังก์ชั่นใหม่ใน.bashrcไฟล์มีคำสั่งรีเฟรชที่จะสามารถใช้นามแฝงหรือฟังก์ชั่นใหม่ได้ทันทีโดยไม่ต้องปิดเทอร์มินัล (ในกรณีของฉัน xfce4 เทอร์มินัล และในระหว่างการทำงาน)

4
ค่า min และ max ของรหัสการออกใน Linux คืออะไร?
ค่า min และ max ของรหัสทางออกต่อไปนี้ใน Linux คืออะไร: โค้ดทางออกที่ส่งคืนจากไบนารีที่เรียกใช้งานได้ (ตัวอย่างเช่น: โปรแกรม C) รหัสทางออกที่ส่งคืนจากสคริปต์ทุบตี (เมื่อโทรexit) รหัสทางออกที่ส่งคืนจากฟังก์ชัน (เมื่อโทรreturn) ผมคิดว่านี่เป็นเรื่องระหว่างและ0255

8
ทำคณิตศาสตร์อย่างง่ายบนบรรทัดคำสั่งโดยใช้ฟังก์ชัน bash: $ 1 หารด้วย $ 2 (อาจใช้ bc)
บางครั้งฉันต้องหารจำนวนหนึ่งด้วยอีก มันจะดีมากถ้าฉันสามารถกำหนดฟังก์ชัน bash สำหรับสิ่งนี้ได้ จนถึงตอนนี้ฉันถูกบังคับให้ใช้นิพจน์เช่น echo 'scale=25;65320/670' | bc แต่มันจะดีมากถ้าฉันสามารถกำหนดฟังก์ชั่น. bashrc ที่ดูเหมือน divide () { bc -d $1 / $2 }

4
ขอบเขตของตัวแปรท้องถิ่นในฟังก์ชั่นเชลล์
หลังจากอ่าน24.2 ตัวแปรท้องถิ่นผมคิดว่าการประกาศตัวแปรvarด้วยคำหลักlocalนั่นหมายความว่าvarค่า 's สามารถเข้าถึงได้เฉพาะภายในบล็อกของรหัสที่คั่นด้วยวงเล็บปีกกาของฟังก์ชั่น อย่างไรก็ตามหลังจากรันตัวอย่างต่อไปนี้ฉันพบว่าvarสามารถเข้าถึงได้อ่านและเขียนจากฟังก์ชั่นที่เรียกใช้โดยบล็อกของรหัสนั้น - เช่นแม้ว่าจะvarถูกประกาศlocalไปouterFuncแล้วinnerFuncก็ยังสามารถอ่านและแก้ไขค่าได้ Run It Online #!/usr/bin/env bash function innerFunc() { var='new value' echo "innerFunc: [var:${var}]" } function outerFunc() { local var='initial value' echo "outerFunc: before innerFunc: [var:${var}]" innerFunc echo "outerFunc: after innerFunc: [var:${var}]" } echo "global: before outerFunc: [var:${var}]" outerFunc echo "global: after outerFunc: [var:${var}]" …

3
ฟังก์ชั่นทำงานเป็นกระบวนการย่อยใน Bash หรือไม่?
ในBash-Scripting Guide ขั้นสูงในตัวอย่างที่ 27-4 , 7-line จากด้านล่างฉันได้อ่าน: ฟังก์ชั่นทำงานเป็นกระบวนการย่อย ฉันทำการทดสอบใน Bash และดูเหมือนว่าข้อความข้างต้นผิด ค้นหาในไซต์นี้ Bash Man และเครื่องมือค้นหาของฉัน คุณมีคำตอบและต้องการอธิบายหรือไม่?
28 bash  process  function 

4
ทำไมฉันต้องใช้ cd“ $ @” แทน cd“ $ 1” เมื่อเขียน wrapper สำหรับ cd?
ที่อื่นฉันได้เห็นฟังก์ชั่น cd ดังนี้ cd() { builtin cd "$@" } ทำไมมันแนะนำให้ใช้$@แทน$1? ฉันสร้างไดเรกทอรีทดสอบ "r st" และเรียกว่าสคริปต์ที่มีฟังก์ชั่นนี้และทำงานได้ทั้งสองวิธี $ . cdtest.sh "r st" แต่ $ . cdtest.sh r stล้มเหลวไม่ว่าฉันจะใช้"$@"หรือ"$1"

4
การเรียกใช้งานฟังก์ชั่นที่ผู้ใช้กำหนดในการค้นหา -exec call
ฉันใช้ Solaris 10 และฉันได้ทดสอบสิ่งต่อไปนี้ด้วย ksh (88), bash (3.00) และ zsh (4.2.1) รหัสต่อไปนี้ไม่ได้ให้ผลลัพธ์ใด ๆ : function foo { echo "Hello World" } find somedir -exec foo \; การค้นหาไม่ตรงกับหลายไฟล์ (ดังแสดงโดยแทนที่-exec ...ด้วย-print) และฟังก์ชั่นการทำงานอย่างสมบูรณ์แบบเมื่อถูกเรียกออกไปข้างนอกจากการfindโทร นี่คือสิ่งที่man findหน้าพูดเกี่ยวกับ-exec: คำสั่ง -exec จริงถ้าคำสั่งดำเนินการส่งกลับ ค่าศูนย์เป็นสถานะออก จุดจบของ คำสั่งจะต้องคั่นด้วยการหลบหนี อัฒภาค (;) อาร์กิวเมนต์คำสั่ง {} คือ แทนที่ด้วยชื่อพา ธ ปัจจุบัน หากว่า อาร์กิวเมนต์สุดท้ายของ -exec คือ …

2
อะไรคือสิ่งที่เทียบเท่ากับ zsh ของ bash's export -f
zshดังนั้นผมจึงเริ่มใช้ ฉันชอบมันทั้งหมด ดูเหมือนดีมากและลื่นไหลและความจริงที่ว่าไดเรกทอรีการทำงานปัจจุบันและบรรทัดคำสั่งจริงนั้นอยู่ในบรรทัดที่ต่างกันเป็นสิ่งที่ดี แต่ในเวลาเดียวกันฉันสังเกตเห็นว่าzshอาจช้ากว่าเล็กน้อยbashโดยเฉพาะเมื่อพิมพ์ข้อความไปที่ จอภาพ สิ่งที่ผมชอบมากที่สุดคือข้อเท็จจริงที่ว่าzshคือ .bashrc'เข้ากันได้กับทุกฟังก์ชั่นที่ผมกำหนดไว้ในของฉัน หนึ่งจับแม้ว่า ฟังก์ชั่นทำงานได้อย่างสมบูรณ์แบบ แต่ฉันไม่สามารถเข้าใจได้ว่าระบบส่งออกทำงานอย่างไร ฉันได้บางส่วนของผู้ฟังก์ชั่นการส่งออกเพื่อที่ฉันจะใช้พวกเขาที่อื่นเช่นในสคริปต์และโปรแกรมภายนอกด้วย.bashrcexport -f ใน zsh การส่งออกดูเหมือนจะไม่ได้พูดคุยด้วยซ้ำ การโหลดอัตโนมัติหรือไม่ สองสิ่งนั้นเหมือนกันหรือไม่ ฉันมีเวลายากที่จะหามัน

6
วิธีเพิ่มฟังก์ชั่นไปยัง. bash_profile / .profile / bashrc ในเชลล์?
ฉันมีฟังก์ชั่นที่แปลงเวลาของยุคปัจจุบัน นี่คือคำจำกัดความ date1(){ date -d @$1 } ฉันต้องการเขียน: $ date1 xxxyyy โดยที่ xxxyyy เป็นพารามิเตอร์ที่ฉันส่งผ่านเข้าไปในฟังก์ชั่นของฉันดังนั้นฉันจะได้รับวันที่ที่สอดคล้องกัน ฉันเข้าใจว่าฉันต้องเพิ่มทั้งใน.bash_profile, .profileหรือ.bashrcแล้วแหล่งที่มาของมัน $ source file แต่ฉันไม่แน่ใจว่าจะใส่ไฟล์ไหนในปัจจุบันฉันมี.profileแล้ว แต่เพื่อให้ทำงานได้ฉันต้องทำsource .profileทุกครั้ง เป็นการดีที่ควรทำให้พร้อมใช้งานเมื่อคอมพิวเตอร์เริ่มทำงานเหมือนตัวแปรสภาพแวดล้อม
24 bash  shell  function  profile 

6
การใช้งานฟังก์ชั่น Bash Script กับ Sudo
ฉันมีสคริปต์ที่ทำสิ่งต่าง ๆ จำนวนมากซึ่งส่วนใหญ่ไม่ต้องการสิทธิ์พิเศษใด ๆ อย่างไรก็ตามหนึ่งส่วนเฉพาะซึ่งฉันมีอยู่ในฟังก์ชั่นต้องการสิทธิ์รูท ฉันไม่ต้องการให้สคริปต์ทั้งหมดทำงานเป็นรูทและฉันต้องการที่จะสามารถเรียกใช้ฟังก์ชั่นนี้ได้โดยใช้สิทธิ์รูทจากภายในสคริปต์ การขอรหัสผ่านหากจำเป็นไม่ใช่ปัญหาเนื่องจากส่วนใหญ่เป็นแบบโต้ตอบอยู่แล้ว อย่างไรก็ตามเมื่อฉันพยายามใช้sudo functionxฉันจะได้รับ: sudo: functionx: command not found อย่างที่ฉันคาดไว้exportก็ไม่ได้สร้างความแตกต่าง ฉันต้องการที่จะสามารถใช้งานฟังก์ชั่นโดยตรงในสคริปต์แทนที่จะแยกมันออกและดำเนินการเป็นสคริปต์แยกต่างหากด้วยเหตุผลหลายประการ มีวิธีที่ฉันสามารถทำให้ฟังก์ชั่น "มองเห็น" ของฉันไปยัง sudo โดยไม่ต้องแตกไฟล์ค้นหาไดเรกทอรีที่เหมาะสม ฟังก์ชั่นมีความยาวประมาณหนึ่งหน้าและมีหลายสตริง มันยังขึ้นอยู่กับฟังก์ชั่นเมนูที่กำหนดไว้ที่อื่นในสคริปต์หลัก ฉันคาดหวังว่าใครบางคนที่มี sudo ใด ๆ เท่านั้นที่สามารถเรียกใช้ฟังก์ชันได้เนื่องจากหนึ่งในสิ่งที่มันทำคือเปลี่ยนรหัสผ่าน
22 bash  sudo  function 

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