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

คำถามเกี่ยวกับเชลล์สคริปต์ไฟล์เรียกทำงานที่ตีความโดยเชลล์ (bash, zsh ฯลฯ )

9
การเพิ่มตัวเลขสองตัวโดยใช้ expr
ฉันกำลังเรียนรู้การเขียนสคริปต์ของเชลล์เพื่อรับประกาศนียบัตรด้านไอทีที่ฉันกำลังทำอยู่ ฉันกำลังพยายามเขียนสคริปต์ขนาดเล็กที่เพิ่มตัวเลขสองตัวตามที่แสดงในหนึ่งในบทเรียนที่เราได้รับ echo "Enter two numbers" read num1 num2 sum = 'expr $num1 + $num2' echo "The sum is = $sum" อย่างไรก็ตามเมื่อฉันให้สิทธิ์การดำเนินการและเรียกใช้สคริปต์มันทำให้ฉันมีข้อผิดพลาดนี้ sum: =. No such file or directory. sum: expr $num1 + $num2: No such file or directory ฉันลองใช้งานทั้ง Ubuntu และ Fedora แต่เกิดข้อผิดพลาดเดียวกัน ใครช่วยกรุณาบอกฉันว่าฉันหายไปที่นี่

8
ฉันจะกำหนดค่า mutt เพื่อแสดงส่วนหัววันที่ในเขตเวลาท้องถิ่นของฉันในเพจเจอร์ได้อย่างไร
เมื่อฉันดูข้อความในเพจเจอร์ mutt แสดงเวลาในส่วนหัว Date ใน UTC แทนที่จะเป็นเขตเวลาท้องถิ่นของฉัน มุมมองดัชนีแสดงเวลาท้องถิ่นอย่างถูกต้อง ฉันพบโพสต์รายชื่อผู้รับจดหมายเก่าที่อธิบายวิธีรับเวลาท้องถิ่นเพื่อแสดงในแถบสถานะที่ด้านล่างของหน้าจอ แต่นี่ยังไม่ "แก้ไข" เวลาในส่วนหัว Date ที่ด้านบนของหน้าจอ มีวิธีใดที่จะทำให้เพจเจอร์แปลงเวลาส่วนหัว Date เป็นเวลาท้องถิ่นหรือไม่?

7
เหตุใดฉันจึงได้รับ“ บรรทัด 1: $ ': \ r': ไม่พบคำสั่ง "
ฉันใช้ Cygwin บนแล็ปท็อปของฉัน (DOS) ฉันมีชุดของสคริปต์จากเพื่อนร่วมงานของฉันและของฉันเอง ฉันไม่ใช่คนไอทีไม่เก่งเรื่องยูนิกซ์ ฉันทำตามไวยากรณ์ของเพื่อนร่วมงานและสามารถจัดการสิ่งต่าง ๆ ได้ง่ายๆ สคริปต์ทำงานได้ดีบนแล็ปท็อปเครื่องเก่าของฉัน ฉันเพิ่งเปลี่ยนแล็ปท็อปติดตั้ง Cygwin เมื่อฉันเรียกใช้สคริปต์สคริปต์จะไม่ทำงาน นี่เป็นตัวอย่างข้อผิดพลาดที่ฉันได้รับ: line 1: $':\r': command not found line 5: syntax error near unexpected token `$'\r'' line 5: `fi นี่คือสคริปต์ 5 บรรทัดแรกของฉัน : iter=1 if [ -f iter.txt ] then rm ./iter.txt fi ใครช่วยกรุณาอธิบายว่าฉันจะแก้ไขปัญหานี้ได้อย่างไร?

4
ฉันจะแยกอาร์กิวเมนต์ตัวเลือกในสคริปต์ทุบตีหากไม่มีการสั่งซื้อได้อย่างไร
ฉันสับสนวิธีรวมอาร์กิวเมนต์ / แฟล็กเผื่อเลือกเมื่อเขียนสคริปต์ทุบตีสำหรับโปรแกรมต่อไปนี้: โปรแกรมต้องการสองอาร์กิวเมนต์: run_program --flag1 <value> --flag2 <value> อย่างไรก็ตามมีแฟล็กเผื่อเลือกหลายรายการ: run_program --flag1 <value> --flag2 <value> --optflag1 <value> --optflag2 <value> --optflag3 <value> --optflag4 <value> --optflag5 <value> ฉันต้องการเรียกใช้สคริปต์ทุบตีเพื่อให้ได้อาร์กิวเมนต์ของผู้ใช้ หากผู้ใช้ป้อนเพียงสองอาร์กิวเมนต์ตามลำดับก็จะเป็น: #!/bin/sh run_program --flag1 $1 --flag2 $2 แต่จะเกิดอะไรขึ้นถ้ามีอาร์กิวเมนต์ตัวเลือกใด ๆ รวมอยู่ด้วย? ฉันคิดว่ามันจะเป็น if [ --optflag1 "$3" ]; then run_program --flag1 $1 --flag2 $2 --optflag1 $3 …

2
Bash Scripting สะท้อนอยู่ภายในฟังก์ชัน
ในสคริปต์ทุบตีฉันพยายามทำให้ตัวแปรของฉันอยู่ในตัวเครื่องให้สามารถทำงานได้ทุกที่และจากนั้นส่งผ่านสิ่งที่ฉันต้องการจากการทำงานเช่นการร้อง #!/bin/bash function FUNCTION() { local LOCAL="value" echo "$LOCAL" # return this variable } GLOBAL=$(FUNCTION) echo "$GLOBAL" แต่มันเป็นไปได้ที่จะทำเช่นนี้ในขณะที่รวมถึง echos ของฟังก์ชั่นเพื่อที่ว่าถ้าฟังก์ชั่นนั้นมีข้อความของตัวเองเพื่อส่งออกฉันไม่ต้องจับมันในตัวแปร #!/bin/bash function FUNCTION() { local LOCAL="value" echo "$LOCAL" # return this variable echo "This function is done now" # do not return this variable } GLOBAL=$(FUNCTION) echo "$GLOBAL" # should …

3
วิธีเปิดใช้เชลล์สคริปต์ด้วยดับเบิลคลิกใน CentOS 7
ฉันต้องสามารถรันเชลล์สคริปต์ที่เรียกใช้งานได้ ( sh) ด้วยการดับเบิลคลิก ฉันตั้งค่าการปฏิบัติธงในสิทธิ์สำหรับไฟล์และเมื่อฉันดับเบิลคลิกที่มันมันจะเปิดขึ้นในโปรแกรมแก้ไขข้อความ ฉันไม่มีตัวเลือกใด ๆ ใน UI ของฉันภายใต้เมนูคุณสมบัติไฟล์เพื่อใช้คำสั่งที่กำหนดเองหรืออะไรก็ได้ จะแสดงเฉพาะแอปพลิเคชั่นต่างๆที่ติดตั้ง ฉันแค่อยากให้มันทำงานไม่มีอะไรเพิ่มเติม ฉันจะทำสิ่งนี้ได้อย่างไร

4
กำหนดพอร์ตที่จัดสรรแบบไดนามิกสำหรับ OpenSSH RemoteForward
คำถาม (TL; DR) เมื่อกำหนดพอร์ตแบบไดนามิกสำหรับการส่งต่อระยะไกล ( -Rตัวเลือกaka ) สคริปต์บนเครื่องระยะไกล (ตัวอย่างเช่นที่มาจาก.bashrc) จะกำหนดว่าพอร์ตใดถูกเลือกโดย OpenSSH พื้นหลัง ฉันใช้ OpenSSH (ทั้งสองด้าน) เพื่อเชื่อมต่อกับเซิร์ฟเวอร์กลางของเราที่ฉันแบ่งปันกับผู้ใช้อื่น ๆ สำหรับเซสชันระยะไกลของฉัน (ตอนนี้) ฉันต้องการส่งต่อ X, ถ้วยและ pulseaudio สิ่งที่สำคัญที่สุดคือการส่งต่อ X โดยใช้-Xตัวเลือก ที่อยู่ X ที่จัดสรรจะถูกเก็บไว้ในตัวแปรสภาพแวดล้อมDISPLAYและจากนั้นฉันสามารถกำหนดพอร์ต TCP ที่สอดคล้องกันได้ในกรณีส่วนใหญ่อย่างไรก็ตาม DISPLAYแต่ผมแทบจะไม่เคยต้องเพราะเกียรตินิยม Xlib ฉันต้องการกลไกที่คล้ายกันสำหรับถ้วยและพูลซีดิโอ พื้นฐานสำหรับบริการทั้งสองมีอยู่ในรูปแบบของตัวแปรสภาพแวดล้อมCUPS_SERVERและPULSE_SERVERตามลำดับ นี่คือตัวอย่างการใช้งาน: ssh -X -R12345:localhost:631 -R54321:localhost:4713 datserver export CUPS_SERVER=localhost:12345 lowriter #and I can print using my …

1
IFS null ไม่เหมือนกับ IFS unset หรือไม่
ผมอ่านคำถามที่ดีที่นี่เรียกว่าเข้าใจไอเอฟเอ ฉันรู้สึกประหลาดใจเพราะคำตอบและความคิดเห็นอ้างถึง POSIX ซึ่งระบุว่า IFS = ไม่เหมือนกับการยกเลิกการตั้งค่า IFS หากคุณยกเลิกการตั้งค่า IFS จะเห็นได้ว่ามีการใช้ค่าเริ่มต้น ถ้าคุณทำให้ IFS เป็นโมฆะแทนจะไม่มีตัวแยก ฉันรู้ว่าฉันเคยเห็นสิ่งที่แตกต่างและฉันพบสิ่งนี้ในบุ๊คมาร์คของฉัน: การเขียนโปรแกรม Bourne Shell $ ไอเอฟเอ ข้อความแรกสุดในสคริปต์ของคุณควรเป็น ไอเอฟเอ = ซึ่งรีเซ็ตตัวคั่นฟิลด์อินพุตเป็นค่าดีฟอลต์ มิฉะนั้นคุณจะสืบทอด $ IFS จากผู้ใช้ซึ่งอาจจะตั้งค่าเป็นค่าที่แปลกประหลาดบางอย่างเพื่อสร้างสตริงการแยกวิเคราะห์ที่แตกต่างจากที่คุณคาดไว้และทำให้เกิดพฤติกรรมแปลก ๆ เป็นเช่นนั้นจริงเมื่อไม่นานมานี้หรือผู้แต่งผิดพลาด

2
shell script: ใช้ sudo ข้างในแล้ว vs รันด้วย sudo?
เมื่อเขียนเชลล์สคริปซึ่งบางคำสั่ง แต่ไม่ใช่ทั้งหมดนั้นจำเป็นต้องมีสิทธิ์ผู้ใช้ขั้นสูง เพิ่ม sudo ไปยังคำสั่งที่ต้องการสิทธิ์ผู้ใช้ขั้นสูงและรันเชลล์สคริปต์โดยไม่ต้อง sudo หรือ ไม่ต้องเพิ่ม sudo ไปยังคำสั่งที่ต้องการสิทธิ์ผู้ใช้ระดับสูง แต่รันเชลล์สคริปต์ด้วย sudo ใช่ไหม ในวิธีที่สองฉันจะต้องให้รหัสผ่านของฉันเพียงครั้งเดียว แต่คำสั่งทั้งหมดในสคริปต์จะทำงานด้วยสิทธิพิเศษ superuser รวมถึงคำสั่งที่ไม่ต้องการ ในวิธีแรกฉันอาจต้องให้รหัสผ่านของฉันหลายครั้งสำหรับคำสั่ง sudo ที่แตกต่างกันในขณะที่สิทธิ์ superuser จะได้รับเฉพาะกับคำสั่งที่ต้องการ จากความกังวลด้านความปลอดภัยวิธีแรกดีกว่า เพื่อความสะดวกวิธีที่สองดีกว่า ฉันคิดว่าจะใช้วิธีแรก ดังนั้นฉันต้องจัดการกับความไม่สะดวกในการให้รหัสผ่านกับคำสั่ง sudo หลายคำในเชลล์สคริปต์ Stephen Harris เขียนว่า : สคริปต์ที่เขียนได้ดีจะตรวจพบว่ามันทำงานด้วยสิทธิ์ที่ถูกต้องและไม่เรียก sudo เลย แต่มีสคริปต์ที่ไม่ดีมากมาย ดังนั้นฉันควรใช้วิธีที่สอง? ถ้าเป็นเช่นนั้น ฉันจะเขียน "สคริปต์จะตรวจพบว่ามันทำงานด้วยสิทธิ์ที่ถูกต้องและไม่เรียก sudo เลย"? ฉันจะปรับปรุงความปลอดภัยเพื่อหลีกเลี่ยงปัญหาในการให้สิทธิ์ผู้ใช้ขั้นสูงสำหรับคำสั่งที่ไม่ต้องการเมื่อใช้งานสคริปต์ด้วย sudo ได้อย่างไร วิธีการแบบง่ายนี้มีวิธีที่ดีที่สุดทั้งสองวิธีหรือไม่: เพิ่ม sudo ไปยังคำสั่งที่ต้องการใช้และรันสคริปต์โดยมีหรือไม่มี sudo …

1
systemd ล้มเหลวในขั้นตอนที่ EXEC วางไข่สคริปต์: ปฏิเสธสิทธิ์การใช้งาน
ฉันกำลังพยายามสร้างบริการ "Hello World" เพื่อที่จะพูด มันถูกเรียกว่าและเป็นร้านที่autologger.service/usr/lib/systemd/system/autologger.service ฉันพยายามsudo service autologger startแต่systemctlส่งคืนมาตรฐาน: Job for autologger.service failed. See 'systemctl status autologger.service' and 'journalctl -xn' for details. เมื่อฉันตรวจสอบ/var/log/messagesฉันเห็นข้อความแสดงข้อผิดพลาดต่อไปนี้: Failed at step EXEC spawning /opt/autologger/placeholder.sh: Permission denied คำถามของฉันคือฉันจะให้สิทธิ์การบริการกับสิ่งใดได้บ้าง นี่คือไฟล์หน่วยบริการ: [Unit] Description=Hello World DefaultDependencies=no Before=shutdown.target reboot.target halt.target [Service] Type=oneshot ExecStart=/opt/autologger/placeholder.sh placeholder.sh ประกอบด้วย #!/bin/bash echo "Hello World"

2
พารามิเตอร์การโทรที่ถูกผูกมัดกับโปรแกรมอรรถประโยชน์ใน Bash
ฉันมีโปรแกรมยูนิกซ์กล่องดำที่ใช้ใน Bash shell ที่อ่านคอลัมน์ข้อมูลจาก stdin ประมวลผลพวกมัน (ใช้เอฟเฟกต์การปรับให้เรียบ) จากนั้นก็ส่งออกไปยัง stdout ฉันใช้มันโดย UNIX ไพพ์เช่น generate | smooth | plot สำหรับการปรับให้เรียบมากขึ้นฉันสามารถทำซ้ำแบบราบรื่นได้ดังนั้นจึงสามารถเรียกใช้จากบรรทัดคำสั่ง Bash เป็น generate | smooth | smooth | plot หรือแม้กระทั่ง generate | smooth | smooth | smooth | smooth | smooth | smooth | smooth | smooth | smooth | smooth | …

4
ทำไมไม่ใช้หลายคำสั่งด้วย || หรือ && ทำงานตามเงื่อนไขหรือไม่
ใช้งานได้ในเชลล์ (ทุบตี, เส้นประ) [ -z "" ] && echo A || echo B A อย่างไรก็ตามฉันพยายามเขียนเชลล์สคริปต์POSIXมันเริ่มต้นดังนี้: #!/bin/sh [ "${#}" -eq 1 ] || echo "Invalid number of arguments, expected one."; exit 1 readonly raw_input_string=${1} [ -z "${raw_input_string}" ] && echo "The given argument is empty."; exit 1 และฉันไม่รู้ว่าทำไม แต่ฉันไม่ได้รับข้อความ : อาร์กิวเมนต์ที่ให้นั้นว่างเปล่า …

6
มีแนว shebang (การประกาศสคริปต์) มากเกินไป - วิธีใดที่จะลดจำนวนลงบ้าง
ฉันมีโครงการประกอบด้วย.shไฟล์ขนาดเล็กประมาณ 20 ไฟล์ ฉันตั้งชื่อ "เล็ก" เหล่านี้เพราะโดยทั่วไปไม่มีไฟล์ใดที่มีโค้ดเกิน 20 บรรทัด ฉันใช้แนวทางแบบแยกส่วนเพราะฉันภักดีต่อปรัชญา Unixและง่ายต่อการดูแลรักษาโครงการ ในการเริ่มต้นของแต่ละไฟล์ผมใส่.sh#!/bin/bash ฉันเข้าใจว่าการประกาศสคริปต์มีจุดประสงค์สองประการ: พวกเขาช่วยให้ผู้ใช้เรียกคืนสิ่งที่เชลล์ต้องการเพื่อเรียกใช้ไฟล์ (พูดหลังจากผ่านไปหลายปีโดยไม่ต้องใช้ไฟล์) พวกเขาให้แน่ใจว่าสคริปต์ทำงานเฉพาะกับเปลือกบางอย่าง (ทุบตีในกรณีนั้น) เพื่อป้องกันพฤติกรรมที่ไม่คาดคิดในกรณีที่ใช้เปลือกอื่น เมื่อโครงการเริ่มเติบโตจากไฟล์ 5 ไฟล์เป็น 20 ไฟล์หรือจาก 20 ไฟล์เป็น 50 ไฟล์ (ไม่ใช่กรณีนี้ แต่เพื่อสาธิต) เรามีการประกาศสคริปต์20 บรรทัดหรือ 50 บรรทัด ฉันยอมรับแม้ว่ามันอาจจะตลกสำหรับบางคน แต่ก็รู้สึกซ้ำซ้อนสำหรับฉันที่จะใช้ 20 หรือ 50 แทนที่จะพูดเพียง1 ต่อโครงการ (อาจเป็นไฟล์หลักของโครงการ) มีวิธีที่จะหลีกเลี่ยงความซ้ำซ้อนที่ถูกกล่าวหานี้ 20 หรือ 50 หรือจำนวนบรรทัดของการประกาศสคริปต์มากขึ้นโดยใช้การประกาศสคริปต์ "ทั่วโลก" ในไฟล์หลักบางไฟล์?

2
ทำไมสคริปต์ของฉันชื่อ“ killl” ล้มเหลว แต่หลังจากการเปลี่ยนชื่อทำงานได้อย่างสมบูรณ์
สคริปต์ที่มีปัญหายุติกระบวนการล่าสุดในพอร์ต localhost ของฉัน 8080 #!/bin/bash x=$(lsof -i:8080 | tail -1 | awk '{print $2}') kill -9 $x มันใช้งานไม่ได้ถ้าสคริปต์ชื่อ 'killl' (หาได้หรือไม่ Kill ล่าสุด?) มันให้ฉันพร้อมท์สำหรับการcmdsubst> เปลี่ยนชื่อสคริปต์เป็น 'asdf' ทุกอย่างทำงานได้ มีคำอธิบายสำหรับพฤติกรรมนี้หรือไม่? ฉันใช้ MacOS El Capitán
12 shell-script  osx 

1
วิธีคัดลอกไฟล์ทั้งหมดในโฟลเดอร์โดยไม่รวมไฟล์ที่กำลังเขียนอยู่?
ผมดาวน์โหลดไฟล์หลายไฟล์ไปยังโฟลเดอร์ที่downloadingผ่านHTTPie สคริปต์ทุบตีมีจุดประสงค์เพื่อประมวลผลไฟล์ที่ดาวน์โหลดมาและฉันพยายามคัดลอกไฟล์ที่ดาวน์โหลดไปยังโฟลเดอร์อื่นเช่น find /folder/downloading -type f -exec mv '{}' /folder/downloaded \; แต่ยังคัดลอกไฟล์ซึ่งยังไม่เสร็จ ฉันพยายาม จำกัด การถ่ายโอนไปยังไฟล์เก่าโดยเพิ่ม-mmin +5ไปยังคำสั่ง คำสั่งที่มีประสิทธิภาพในการปล่อยให้ไฟล์กำลังถูกเขียนและโอนย้ายไฟล์ที่ดาวน์โหลดมาเท่านั้น?

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