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

เชลล์เป็นอินเตอร์เฟสบรรทัดคำสั่งของ Unix คุณสามารถพิมพ์คำสั่งในเชลล์แบบโต้ตอบหรือเขียนสคริปต์เพื่อทำงานอัตโนมัติ ใช้แท็กนี้สำหรับคำถามที่ใช้กับ / bin / sh และเชลล์ที่เข้ากันได้มากที่สุด (ash, bash, ksh, zsh, …) สำหรับเชลล์สคริปต์ที่มีข้อผิดพลาดโปรดตรวจสอบใน http://shellcheck.net ก่อนโพสต์ที่นี่

3
เหตุใดตัวเลือกในตัวแปรที่ยกมาจึงล้มเหลว แต่ทำงานเมื่อไม่ได้อ้างอิง
ฉันอ่านเกี่ยวกับว่าฉันควรอ้างอิงตัวแปรใน bash เช่น "$ foo" แทนที่จะเป็น $ foo อย่างไรก็ตามในขณะที่เขียนสคริปต์ฉันพบกรณีที่ใช้ได้โดยไม่ต้องใส่เครื่องหมายคำพูด แต่ไม่ใช่กับพวกเขา: wget_options='--mirror --no-host-directories' local_root="$1" # ./testdir recieved from command line remote_root="$2" # ftp://XXX recieved from command line relative_path="$3" # /XXX received from command line อันนี้ใช้ได้ผล: wget $wget_options --directory_prefix="$local_root" "$remote_root$relative_path" อันนี้ไม่ (บันทึกคำพูดคู่ aroung $ wget_options): wget "$wget_options" --directory_prefix="$local_root" "$remote_root$relative_path" อะไรคือสาเหตุของสิ่งนี้? บรรทัดแรกเป็นเวอร์ชั่นที่ดี; หรือฉันควรสงสัยว่ามีข้อผิดพลาดที่ซ่อนอยู่ที่ไหนสักแห่งที่ทำให้เกิดพฤติกรรมนี้? …


3
ความหมายของ [“ $ {1: 0: 1}” = '-']
ฉันมีสคริปต์ต่อไปนี้เพื่อเริ่มกระบวนการ MySQL: if [ "${1:0:1}" = '-' ]; then set -- mysqld_safe "$@" fi if [ "$1" = 'mysqld_safe' ]; then DATADIR="/var/lib/mysql" ... 1: 0: 1 หมายถึงอะไรในบริบทนี้
18 linux  bash  shell 

2
มีบางอย่างเช่น "แยก ()" ของ JavaScript ในเปลือกหรือไม่
มันใช้งานง่ายมากsplit()ใน JavaScript เพื่อแยกสตริงออกเป็นอาร์เรย์ เชลล์สคริปต์เป็นอย่างไร พูดว่าฉันต้องการทำสิ่งนี้: $ script.sh var1_var2_var3 เมื่อผู้ใช้ให้สตริงดังกล่าวvar1_var2_var3กับ script.sh ภายในสคริปต์มันจะแปลงสตริงเป็นอาร์เรย์เช่น array=( var1 var2 var3 ) for name in ${array[@]}; do # some code done

4
ใช้ #! / bin / sh หรือ #! / bin / bash สำหรับ Ubuntu-OSX ที่ใช้งานร่วมกันได้และใช้งานง่าย & POSIX
ฉันรู้ว่าฉันสามารถใช้เป็นบรรทัดแรกของสคริปต์เพื่อเรียกใช้เชลล์ที่ต้องการ จะ#!/bin/shแนะนำถ้าเข้ากันได้กับทุกระบบยูนิกซ์เป็นข้อกำหนดที่แน่นอน? ในกรณีของฉันระบบปฏิบัติการเดียวที่ฉันสนใจคือ Ubuntu (Debian) และ OSX จากที่ฉันสามารถใช้#!/bin/bashและมั่นใจได้ว่ามันจะทำงานบนทั้งสองระบบ? นี่จะทำให้การใช้สคริปต์ที่ง่ายขึ้นและมีไวยากรณ์ที่ทันสมัยและชัดเจนยิ่งขึ้นสำหรับคำสั่งหรือไม่ การใช้#!/bin/shยังเกี่ยวข้องกับการใช้ POSIX หรือไม่
18 bash  shell  ubuntu  osx  posix 

2
ทำไมตัวแปรจึงมองเห็นได้ใน subshell
Learning Bash Book กล่าวถึงว่า subshell จะสืบทอดเฉพาะตัวแปรสภาพแวดล้อมและ file descriptors ฯลฯ และจะไม่รับสืบทอดตัวแปรที่ไม่ได้ถูกส่งออก: $ var=15 $ (echo $var) 15 $ ./file # this file include the same command echo $var $ ฉันรู้ว่าเชลล์จะสร้างสอง subshell สำหรับ()และ for ./fileแต่ทำไมใน()กรณีที่ subshell ระบุvarตัวแปรแม้ว่าจะไม่ถูกส่งออกและใน./fileกรณีที่มันไม่ได้ระบุมัน? # Strace for () clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f24558b1a10) = 25617 # Strace for ./file clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, …
18 bash  shell  subshell 


2
การเขียนสคริปต์แบบพกพามีความสำคัญเมื่อใด
รหัสส่วนใหญ่ฉันเขียนอยู่ใน PHP ฉันเพิ่งเริ่มเรียนรู้การเขียนสคริปต์เชลล์ ทรัพยากรและแบบฝึกหัดส่วนใหญ่ที่ฉันเจอนั้นเฉพาะเจาะจงกับ Bash บางคนเตือนเกี่ยวกับ bashisms และบางคนไม่ทำ ฉันอ่านมากที่นี่และ Stack Overflow เมื่อใดก็ตามที่คำตอบใช้bashismsบางคนย่อมแสดงความคิดเห็นว่า: คุณไม่ควรใช้ <insert bashism ที่นี่> มันไม่ได้พกพา bashนี้เกิดขึ้นแม้ในขณะที่คำถามที่ได้รับการติดแท็กด้วย สำหรับฉันแล้วมันเหมือนกับบอกโปรแกรมเมอร์ PHP ว่าพวกเขาไม่ควรใช้รหัสที่ใหม่ใน PHP 5 เพราะมันไม่สามารถใช้กับ PHP 4 หรือบอกคนที่พวกเขาไม่ควรเขียนอะไรบางอย่างสำหรับ Mac เพราะมันไม่สามารถใช้ บน Windows เมื่อผมเขียนใน PHP, ฉันได้รับความต้องการขั้นต่ำและที่ผมเขียนไปข้างหน้ารหัสใช้ได้กับระบบปฏิบัติการ ฉันไม่ต้องกังวลกับการทำให้ย้อนกลับ -เข้ากันได้ ถ้าฉันใช้#!/bin/bashเป็นสาวเธอทำไมฉันไม่ควรใช้วิธีการทุบตี? ฉันเริ่มที่จะได้รับความประทับใจที่บางคนชอบทุบตี bashisms (ปุนตั้งใจ) เพียงเพื่อประโยชน์ของมัน ผู้คนมักจะใช้bashและใช้shellแทนกันได้ - อาจเป็นเพราะการทุบตีเป็นเชลล์เริ่มต้นในหลาย ๆ ระบบ ดังนั้นฉันสามารถเข้าใจการเพิ่มความคิดเห็นเพื่อเตือนว่ารหัสใช้ bashisms แต่ฉันไม่เข้าใจความหมายที่ผิดที่จะใช้พวกเขา เห็นได้ชัดว่าถ้าฉันเขียนสคริปต์อย่างเคร่งครัดเพื่อใช้ส่วนตัวฉันสามารถเขียนเป็นภาษาใดก็ได้ที่ฉันต้องการ …

2
การขยายตัวของตัวแปรหอยและผลกระทบของ glob และแยกกับมัน
จริงๆแล้วโพสต์นี้มีคำถามสองข้อแยกกัน แต่ฉันคิดว่าการรวมกลุ่มพวกเขาเข้าด้วยกันจะให้บริบทเพิ่มเติม ฉันผ่านคำถามนี้ไปแล้วเกี่ยวกับเครื่องหมายคำพูดเกี่ยวกับตัวแปรแต่ฉันไม่เข้าใจว่าการขยายตัวของตัวแปรหมายถึงอะไรในตอนแรก ดังนั้นคำถามแรกของฉันคือ: อะไรคือการขยายตัวของตัวแปรใน Unix / Linux พูด? ส่วนที่สองของคำถามของฉันเกี่ยวข้องกับข้อกำหนดต่อไปนี้: glob แยก ค่าข้างต้นหมายถึงอะไรและมีผลต่อการขยายตัวของตัวแปรอย่างไร คำตอบสำหรับคำถามเดิมกล่าวถึงต่อไปนี้: คิดว่าไม่มีเครื่องหมายคำพูด (ในบริบทรายการ) เป็นตัวดำเนินการแยก + glob ราวกับว่า echo $ test เป็น echo glob (แยก ("$ test")) ฉันไม่สามารถหาคำตอบใด ๆ ที่อยู่ตรงแนวคิดของglobbingและแยกแต่ใช้คำเหล่านั้นได้โดยตรงในการตอบคำถามอื่น ๆ เช่นนี้หนึ่งเมื่อเร็ว ๆ นี้

2
เป็นอันตรายหรือไม่หากปิดหน้าต่างเทอร์มินัลโดยไม่ออกจากแอปพลิเคชันอย่างถูกต้อง
การใช้ Ubuntu 12.04 LTS คำถามของฉันคือถ้าฉันเริ่มต้นแอปพลิเคชันในหน้าต่างเทอร์มินัลแล้วมีอะไรที่ไม่ดีเกี่ยวกับการปิดหน้าต่างเทอร์มินัลโดยไม่ต้องออกจากแอปพลิเคชันก่อน ตัวอย่างเช่นฉันใช้ MATLAB ฉันเปิดสถานีและพิมพ์ matlab -nodisplay -nodesktop -nosplash จากนั้นเรียกใช้สคริปต์จำนวนมาก จากนั้นฉันก็สามารถทำได้ exit เพื่อสิ้นสุด MATLAB แล้วปิดหน้าต่างเทอร์มินัลหรือเพียงแค่ปิดหน้าต่างเทอร์มินัล ความแตกต่างระหว่างสองวิธีนี้จริงๆคืออะไร? วิธีที่สองจะ "ทำอันตราย" อย่างใดไหม? เป็นวิธีแรกที่ต้องการหรือไม่ ทำไม?

5
ผู้ใช้จะไม่ให้เชลล์บันทึกคำสั่งของเขาลงในประวัติศาสตร์ในสถานการณ์ใด
หากฉันเพิ่มexport HISTCONTROL=ignorespaceเข้า.bashrcมาทุบตีจะไม่บันทึกคำสั่งใด ๆ ที่มีช่องว่างก่อนหน้าพวกเขาลงในประวัติศาสตร์ แต่ฉันไม่เข้าใจว่าสถานการณ์จะเป็นประโยชน์หรือไม่ ใครช่วยยกตัวอย่างบ้าง

4
การกำหนดค่า git สามารถตั้งค่าได้หลายที่เก็บหรือไม่?
Git ดูเหมือนว่าจะสนับสนุนค่าการกำหนดค่าที่สามระดับ: การตั้งค่าส่วนกลางต่อระบบ (เก็บไว้ใน/etc/git-core) การตั้งค่าส่วนกลางต่อผู้ใช้ (เก็บไว้ใน~/.gitconfig) การตั้งค่าโลคัลต่อที่เก็บ (เก็บไว้ใน$REPO/.git/config) ตัวเลือกเหล่านี้ครอบคลุมพื้นฐานเกือบทั้งหมด แต่ฉันกำลังมองหาวิธีจัดการกับระดับที่สี่ ฉันมีคอลเลกชันขนาดใหญ่มากซึ่งฉันต้องใช้ค่าที่แตกต่างuser.emailจากปกติ ที่เก็บเหล่านี้มักจะถูกสร้างและจัดการผ่านสคริปต์อัตโนมัติและการตั้งค่าต่อการตั้งค่าท้องถิ่นของที่เก็บนั้นยุ่งยาก ที่เก็บทั้งหมดที่เป็นปัญหาอยู่ภายใต้คำนำหน้าเส้นทางที่แน่นอนในระบบท้องถิ่นของฉัน มีวิธีการตั้งค่าการกำหนดค่าบางที่จะได้รับมรดกโดยที่เก็บทั้งหมดภายใต้เส้นทางนั้นหรือไม่? (การเรียงลำดับของ.htaccessการตั้งค่าที่ชอบสืบทอดมาจนถึงระบบไฟล์) บางทีอาจมีวิธีตั้งค่าตามเงื่อนไขในไฟล์กำหนดค่าส่วนกลางหรือไม่ การเตรียมการอื่น ๆ ที่สามารถทำในสภาพแวดล้อม UNIX เพื่อรับมือกับชุดของที่เก็บเช่นฉัน?
18 shell  git 

2
วิธีการใช้ไดเรกทอรี chmod ซ้ำโดยไม่ส่งผลกระทบต่อไฟล์?
หลังจากที่ฉันใช้chmod -Rกับไดเรกทอรีแล้วสิทธิ์จะเปลี่ยนสำหรับทุกสิ่งภายใน (ไฟล์และไดเรกทอรี) ฉันจะเพิ่มสิทธิ์ดำเนินการ / ค้นหา ( x) ในไดเรกทอรีโดยไม่ต้องแก้ไขไฟล์ได้อย่างไร
18 shell  find  chmod 

3
จะเลือกกระบวนการเฉพาะด้วย 'top' ได้อย่างไร
ในกรณีที่โปรแกรมหนึ่งมีหลายอินสแตนซ์การรันpidof programจะให้: `1 2 3` top -pยอมรับข้อโต้แย้งที่คั่นด้วยเครื่องหมายจุลภาค: 1, 2, 3. ซึ่งหมายความว่าtop -p `pidof program`จะไม่ทำงาน: top: unknown argument '1' usage: top -hv | -bcisSH -d delay -n iterations [-u user | -U user] -p pid [,pid ...] คุณช่วยแสดงให้ฉันดูวิธีการทำสิ่งนี้ได้ไหม ฉันไม่คุ้นเคยกับ awk, sed, etc ...

7
รวบรวมรหัสทางออกของกระบวนการพื้นหลังแบบขนาน (เชลล์ย่อย)
สมมติว่าเรามีสคริปต์ทุบตีดังนี้: echo "x" & echo "y" & echo "z" & ..... echo "Z" & wait มีวิธีในการรวบรวมรหัสทางออกของกระบวนการย่อย / กระบวนการย่อยหรือไม่? กำลังมองหาวิธีการทำสิ่งนี้และหาอะไรไม่เจอ ฉันต้องเรียกใช้ subshells เหล่านี้ในแบบคู่ขนานมิฉะนั้นจะทำได้ง่ายกว่านี้ ฉันกำลังมองหาโซลูชันทั่วไป (ฉันมีกระบวนการย่อยจำนวนไม่ทราบ / แบบไดนามิกเพื่อให้ทำงานแบบขนาน)

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