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

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

3
เชลล์: ขึ้นบรรทัดใหม่ต่อท้าย ('\ n') ในการทดแทนคำสั่ง
ฉันต้องการที่จะสามารถที่จะจับเอาท์พุทแน่นอนของแทนคำสั่งรวมทั้งตัวอักษรต่อท้ายบรรทัดใหม่ ฉันรู้ว่าพวกเขาถูกปล้นโดยค่าเริ่มต้นดังนั้นการจัดการบางอย่างอาจจำเป็นต้องเก็บไว้และฉันต้องการเก็บรหัสทางออกดั้งเดิมไว้ ตัวอย่างเช่นกำหนดคำสั่งด้วยจำนวนตัวแปรของการขึ้นบรรทัดใหม่และรหัสออก: f(){ for i in $(seq "$((RANDOM % 3))"); do echo; done; return $((RANDOM % 256));} export -f f ฉันต้องการเรียกใช้บางสิ่งเช่น: exact_output f และมีผลลัพธ์เป็น: Output: $'\n\n' Exit: 5 ฉันสนใจทั้งในbashและ shPOSIX
14 bash  shell 

3
กับดักได้รับมรดกโดย subshell หรือไม่
ฉันลองใช้สคริปต์ต่อไปนี้: #!/bin/bash trap 'echo "touching a file" && touch $FILE' EXIT foo1(){ echo "foo1" } foo(){ echo "foo" export FILE=${FILE:-/tmp/file1} } (foo1) foo ผลลัพธ์สำหรับสคริปต์ข้างต้นคือ: [root@usr1 my_tests]# ./test.sh foo1 foo touching a file อย่างไรก็ตามฉันคาดหวังว่ากับดักจะถูกเรียกเมื่อออกจากfoo1เช่นกันซึ่งเรียกว่าใน subshell คาดหวังหรือไม่ มีการtrapสืบทอดโดย subshell หรือไม่ ถ้าใช่แล้วในกรณีใดที่trapสืบทอดโดย subshell?
14 shell  trap  subshell 

3
ตัดสตริงบนตัวคั่นล่าสุด
ฉันมีชื่อไฟล์เช่นa.b.c.txtผมต้องการสตริงนี้จะแยกเป็น string1=a.b.c string2=txt โดยทั่วไปฉันต้องการแยกชื่อไฟล์และส่วนขยาย ผมใช้cutแต่มันแยกเป็นและa,b,c txtฉันต้องการตัดสายบนตัวคั่นสุดท้าย ใครช่วยได้บ้าง
14 shell  cut 

2
/ bin / sh: ข้อผิดพลาดการนำเข้าคำจำกัดความฟังก์ชันสำหรับ 'some-function'
ฉันพบข้อผิดพลาดนี้เมื่ออัปเดต bash สำหรับปัญหาด้านความปลอดภัย CVE-2014-6271: # yum update bash Running transaction (shutdown inhibited) Updating : bash-4.2.47-4.fc20.x86_64 /bin/sh: error importing function definition for `some-function'
14 bash  shell  function 

3
ทุบตีเพิ่มคำพูดเดียวพิเศษ
ฉันมีปัญหาในการใช้งานสคริปต์ของฉัน เมื่อรันมันในโหมดดีบั๊ก (bash -x) ฉันเห็นว่า bash กำลังเพิ่มราคาพิเศษ ดังนั้นสคริปต์ของฉันจึงล้มเหลว นี่คือภายในสคริปต์ของฉัน: testvar="\"sudo /home/pi/shared/blink.sh 27 off\"" ssh -n -q -q -o BatchMode=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o ConnectTimeout=5 $1 ${testvar} นี่คือผลลัพธ์: ssh -n -q -q -o BatchMode=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o ConnectTimeout=5 192.168.42.105 '"sudo' /home/pi/shared/blink.sh 27 'off"'
14 shell  ssh  quoting 


4
ลบอักขระสิ้นสุดบรรทัดออกจาก stdout หรือไม่ หลายบรรทัดเป็นบรรทัดเดียว
ฉันมีสคริปต์ที่แสดงผลข้อความต่อไปนี้ นี่คือผลลัพธ์จากโมเด็มNetSL 2210-02 ADSL2 ADSL Line State: Up ADSL Startup Attempts: 1 ADSL Modulation: DMT ADSL Data Path: Fast Datapump Version: DSP 7.2.3.0, HAL 7.2.1.0 SNR Margin: 8.20 9.00 dB Line Attenuation: 57.50 31.00 dB Output Power: 17.09 12.34 dBm Errored Seconds: 0 0 Loss of Signal: 0 476 Loss …

2
คำสั่งของ executables เริ่มต้นด้วยการทุบตี
ถ้าฉันรันtestคำสั่งใน bash testยูทิลิตี้ในตัว (ประเมินนิพจน์แบบมีเงื่อนไข) จะเริ่มขึ้น: $ type test test is a shell builtin $ type -a test test is a shell builtin test is /usr/local/bin/test test is /usr/bin/test $ อย่างไรก็ตามดังที่เห็นในผลลัพธ์ของtype -a testข้างต้นมีอีกหนึ่งtestในไดเรกทอรี / usr / local / bin และอีกหนึ่งในไดเรกทอรี / usr / bin สั่งซื้อไฟล์เอ็กซีคิ้วท์ได้อย่างไรคือคำสั่งในตัวที่ต้องการเสมอแล้วคำสั่งที่เหลือจะขึ้นอยู่กับลำดับของไดเรกทอรีในตัวแปร $ PATH นอกจากนี้เป็นไปได้หรือไม่ที่จะเปลี่ยนลำดับของโปรแกรมเริ่มทำงานเช่นถ้าฉันพิมพ์ระบบtestจะเริ่ม / usr / …

3
echo หรือ print / dev / stdin / dev / stdout / dev / stderr
ฉันต้องการพิมพ์ค่าของ / dev / stdin, / dev / stdout และ / dev / stderr นี่คือสคริปต์ง่าย ๆ ของฉัน: #!/bin/bash echo your stdin is : $(</dev/stdin) echo your stdout is : $(</dev/stdout) echo your stderr is : $(</dev/stderr) ฉันใช้ท่อต่อไปนี้: [root@localhost home]# ls | ./myscript.sh [root@localhost home]# testerr | ./myscript.sh เพียง แต่$(</dev/stdin)ดูเหมือนว่าจะทำงานผมยังได้พบกับคนอื่น ๆ …

4
เก็บรหัสทางออกเมื่อวางกับ SIGINT และคล้ายกันหรือไม่
หากฉันใช้trapเช่นอธิบายไว้ในhttp://linuxcommand.org/wss0160.php#trapเพื่อจับ ctrl-c (หรือคล้ายกัน) และการล้างข้อมูลก่อนออกจากนั้นฉันจะเปลี่ยนรหัสออกที่ส่งคืน ตอนนี้อาจจะไม่สร้างความแตกต่างในโลกแห่งความเป็นจริง (เช่นเพราะรหัสออกไม่ได้พกพาและด้านบนของที่ไม่โปร่งใสตลอดเวลาตามที่กล่าวไว้ในรหัสทางออกเริ่มต้นเมื่อกระบวนการสิ้นสุดลง? ) แต่ฉันสงสัยว่ามี จริงๆแล้วไม่มีวิธีในการป้องกันและส่งคืนรหัสข้อผิดพลาดเริ่มต้นสำหรับสคริปต์ที่ถูกขัดจังหวะแทนหรือไม่ ตัวอย่าง (เป็น bash แต่คำถามของฉันไม่ควรพิจารณาเฉพาะ bash): #!/bin/bash trap 'echo EXIT;' EXIT read -p 'If you ctrl-c me now my return code will be the default for SIGTERM. ' _ trap 'echo SIGINT; exit 1;' INT read -p 'If you ctrl-c me now …


2
โครงสร้างข้อมูลของ $ @ ในเชลล์คืออะไร?
เรามักจะใช้$@เพื่อเป็นตัวแทนของการโต้แย้งทั้งหมดยกเว้น $ 0 อย่างไรก็ตามฉันไม่รู้ว่าโครงสร้างข้อมูล$@คืออะไร ทำไมมันมีพฤติกรรมแตกต่างกัน$*เมื่อรวมอยู่ในเครื่องหมายคำพูดคู่ใครสามารถให้คำอธิบายระดับล่ามให้ฉันได้หรือไม่ มันสามารถวนซ้ำในห่วงดังนั้นดูเหมือนว่าจะเป็นอาร์เรย์ อย่างไรก็ตามมันยังสามารถสะท้อนได้อย่างง่ายดายecho $@ถ้าเป็นอาร์เรย์จะมีเพียงองค์ประกอบแรกเท่านั้นที่แสดง เนื่องจากข้อ จำกัด ของเชลล์ฉันไม่สามารถเขียนโค้ดการทดสอบเพิ่มเติมเพื่อดำเนินการได้ ความแตกต่างระหว่างโพสต์นี้ : โพสต์นี้แสดงให้เห็นว่า$@พฤติกรรมแตกต่างจาก$*อย่างไร $@แต่ฉันสงสัยเกี่ยวกับชนิดข้อมูลของ เชลล์ในฐานะภาษาตีความเช่น Python ควรแสดงข้อมูลตามชุดของประเภทพื้นฐาน หรือกล่าวอีกนัยหนึ่งฉันต้องการทราบว่า $ @ เก็บไว้ในหน่วยความจำคอมพิวเตอร์อย่างไร มันเป็นสตริงสตริงหลายบรรทัดหรืออาร์เรย์หรือไม่? หากเป็นชนิดข้อมูลที่ไม่ซ้ำใครเป็นไปได้ไหมที่จะกำหนดตัวแปรที่กำหนดเองเป็นตัวอย่างของประเภทนี้
13 bash  shell 

3
ทำไม "ps axe" ไม่พบสคริปต์ทุบตีที่รันอยู่โดยไม่มี“ #!” หัวข้อ?
เมื่อฉันเรียกใช้สคริปต์นี้ตั้งใจให้ทำงานจนกว่าจะฆ่า ... # foo.sh while true; do sleep 1; done ... ฉันไม่สามารถหาได้โดยใช้ps ax: >./foo.sh // In a separate shell: >ps ax | grep foo.sh 21110 pts/3 S+ 0:00 grep --color=auto foo.sh ... แต่ถ้าฉันเพิ่งเพิ่ม#!ส่วนหัว " " ทั่วไปลงในสคริปต์ ... #! /usr/bin/bash # foo.sh while true; do sleep 1; done ... จากนั้นสคริปต์จะสามารถค้นหาได้โดยpsคำสั่งเดียวกัน... >./foo.sh …

2
ทำไม SSH ไม่รอกระบวนการพื้นหลัง
ทำไมมันssh -tไม่รอให้งานพื้นหลังเสร็จ? ตัวอย่าง: ssh user@example 'sleep 2 &' ใช้งานได้ตามที่คาดไว้เนื่องจาก ssh กลับมาหลังจาก 2 วินาทีในขณะที่ ssh user@example -t 'sleep 2 &' ไม่รอsleepให้เสร็จและส่งคืนทันที ทุกคนสามารถอธิบายเหตุผลที่อยู่เบื้องหลังสิ่งนี้ได้ไหม มีวิธีssh -tรอกระบวนการพื้นหลังทั้งหมดให้เสร็จก่อนที่จะส่งคืนหรือไม่ กรณีการใช้งานของฉันคือฉันเริ่มต้นสคริปต์ด้วยssh -tและสคริปต์นี้เริ่มงานพื้นหลังต่าง ๆ ที่ควรมีชีวิตอยู่หลังจากสคริปต์หลักเสร็จสิ้น ด้วยssh -tสิ่งนี้เป็นไปไม่ได้จนถึงตอนนี้

6
การตรวจสอบความถูกต้องของไบนารีคำสั่งก่อนดำเนินการ
มีวิธีการตรวจสอบสิ่งที่คุณกำลังดำเนินการจากสคริปต์ทุบตีจริง ๆ ? บอกว่าทุบตีสคริปต์ของคุณจะถูกเรียกหลายคำสั่ง (ตัวอย่างเช่น: tar, mail, scp, mysqldump) และคุณยินดีที่จะให้แน่ใจว่าtarเป็นจริงจริงtarซึ่งเป็นที่ระบุโดยrootผู้ใช้เป็นไฟล์และไดเรกทอรีแม่เจ้าของและเป็นคนเดียวที่มีสิทธิ์ในการเขียน และไม่ได้/tmp/surprise/tarมีwww-dataหรือapache2เป็นเจ้าของ แน่ใจว่าฉันรู้เกี่ยวกับPATHสภาพแวดล้อมและฉันอยากรู้ว่านี้สามารถตรวจสอบเพิ่มเติมจากสคริปต์ทุบตีทำงานและถ้าเป็นเช่นนั้นได้อย่างไร ตัวอย่าง: (หลอกรหัส) tarfile=$(which tar) isroot=$(ls -l "$tarfile") | grep "root root" #and so on...

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