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

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

4
Bash: พรอมต์ระยะไกลแบบโต้ตอบ
ฉันมีสคริปต์ที่เชื่อมต่อกับเซิร์ฟเวอร์ระยะไกลและตรวจสอบว่ามีการติดตั้งแพคเกจ: ssh root@server 'bash -s' < myscript.sh myscript.sh: OUT=`rpm -qa | grep ntpdate` if [ "$OUT" != "" ] ; then echo "ntpdate already installed" else yum install $1 fi ตัวอย่างนี้สามารถทำให้ง่ายขึ้น นี่คือmyscript2.shสิ่งที่มีปัญหาเดียวกัน: read -p "Package is not installed. Do you want to install it (y/n)?" choise ปัญหาของฉันคือทุบตีไม่สามารถอ่านคำตอบของฉันแบบโต้ตอบ มีวิธีดำเนินการสคริปต์ท้องถิ่นจากระยะไกลโดยไม่สูญเสียความสามารถในการแจ้งผู้ใช้หรือไม่
16 bash  shell-script  ssh  stdin  read 

3
การยกเลิกสคริปต์เชลล์ bash ที่รันในพื้นหลัง
ฉันมักจะใช้bashเชลล์สคริปต์เพื่อรันคำสั่งง่าย ๆ สำหรับไฟล์ที่แตกต่างกัน ตัวอย่างเช่นสมมติว่าฉันมีดังต่อไปนี้bashเชลล์สคริปต์เรียกscript.shว่ารันโปรแกรม / คำสั่งfooสามไฟล์ข้อความ"a.txt", "b.txt", "c.txt": #!/bin/bash for strname in "a" "b" "c" do foo $strname".txt" done นอกจากนี้สมมติว่าfoo $strname".txt"ช้าดังนั้นการเรียกใช้สคริปต์จะใช้เวลานาน (ตัวอย่างเช่นชั่วโมงหรือวัน) ด้วยเหตุนี้ฉันต้องการใช้nohupเพื่อให้การดำเนินการต่อไปแม้ว่าเทอร์มินัลจะปิดหรือตัดการเชื่อมต่อ ฉันต้องการให้สคริปต์ไปที่พื้นหลังทันทีดังนั้นฉันจะใช้&โอเปอเรเตอร์ ดังนั้นฉันจะใช้คำสั่งต่อไปนี้เพื่อโทรscript.sh: nohup bash script.sh & วิธีนี้ใช้งานได้ดีสำหรับการเรียกใช้สคริปต์ในพื้นหลังและไม่มีการแฮงค์ แต่ตอนนี้สมมติว่าฉันต้องการยุติการประมวลผลในบางจุดด้วยเหตุผลบางอย่าง ฉันจะทำสิ่งนี้ได้อย่างไร ปัญหาที่ฉันได้พบก็คือว่าโดยดูที่topผมเห็นเพียงที่สอดคล้องกับfoo "a.txt"ฉันสามารถยุติการfooโทรนั้นได้ แต่จากนั้นการโทรที่fooสอดคล้องกันจะ"b.txt"ได้รับการเรียกและจากนั้นฉันต้องยุติการโทรนั้นเช่นกันและต่อไปเรื่อย ๆ สำหรับไฟล์ข้อความหลายสิบหรือร้อยไฟล์ที่ระบุในforลูปมันจะกลายเป็นความเจ็บปวดที่จะยกเลิกทุก ๆไฟล์ทีละไฟล์foo! ดังนั้นฉันต้องยกเลิกเชลล์สคริปเองแทนการโทรเฉพาะที่ออกจากเชลล์สคริป เมื่อฉันพิมพ์คำสั่ง ps -u myusername myusernameชื่อผู้ใช้ของฉันอยู่ที่ไหนฉันได้รับรายการกระบวนการที่ฉันใช้อยู่ bashแต่ผมเห็นสองรหัสกระบวนการที่แตกต่างกันเรียกว่า ฉันจะรู้ได้อย่างไรว่ากระบวนการเหล่านี้ถ้ามีการสอดคล้องกับการเรียกร้องเดิมของฉันnohup bash script.sh &?

2
Dash, Ash และ sh รองรับสคริปต์ได้ 100% หรือไม่
ฉันต้องการทราบว่าสคริปต์ที่เขียนขึ้นสำหรับเส้นประเถ้าและ sh เข้ากันได้ 100% หรือไม่ มีฟีเจอร์ที่เพิ่มเข้ามาเพื่อขีดหรือเถ้าหรือการเปลี่ยนแปลงทางไวยากรณ์หรือไม่? จากสิ่งที่ฉันได้ยินเถ้าเป็นลูกหลานของดวลจุดโทษโดยตรง

4
เส้นทางอาคารแข็งแรง
ว่าฉันมีตัวแปรหลายตัวในเชลล์สคริปต์ (เช่นใน zsh): FOLDER_1, FOLDER_2, etc. /ตัวแปรเหล่านี้หมายถึงโฟลเดอร์ลงมาจาก ตัวอย่างเช่นถ้าฉันมีเส้นทาง/home/me/stuff/items ตัวแปรจะเป็น: FOLDER_1='home' FOLDER_2='me' FOLDER_3='stuff' ตอนนี้พูดว่าฉันต้องการที่จะสร้างเส้นทางที่สอดคล้องกันกลับมาโดยการเชื่อมโยงตัวแปร วิธีหนึ่งที่เป็นไปได้คือการสร้างเส้นทางดังนี้: PATH=$FOLDER_1/$FOLDER_2/$FOLDER_3/ อย่างไรก็ตามบอกว่าตัวแปรบางตัวFOLDER_iมาพร้อมกับเครื่องหมายสแลชข้างหน้าในขณะที่คนอื่นไม่ทราบ (และเราไม่รู้ว่า) FOLDER_1='home' FOLDER_2='stuff/' FOLDER_3='items' คำถามของฉันคือ: ฉันจะสร้างเส้นทางที่แข็งแกร่งได้อย่างไร (เช่นหลีกเลี่ยงการทับสองครั้งและเพิ่มในที่ที่จำเป็น) ฉันคิดว่าวิธีหนึ่งในการทำเช่นนี้คือการเพิ่ม/ตัวแปรระหว่างคู่เสมอจากนั้นลบรายการที่ซ้ำกันด้วยsedแต่ฉันไม่สามารถทำงานได้ (ฉันไม่แน่ใจว่าฉันจัดการ/อย่างถูกต้องหรือไม่sed) นอกจากนี้ฉันจะสร้างล้อใหม่ได้หรือไม่ (เช่นมีในตัวที่ทำเช่นนี้แล้ว?) ในที่สุดถ้าตัวแปรอยู่ในอาร์เรย์เช่นFOLDERSมันเป็นไปได้ไหมที่จะทำโดยไม่ต้องวนซ้ำ? (หรืออีกวิธีหนึ่งโดยการวนซ้ำ แต่ไม่ทราบว่าFOLDERSมีจำนวนเท่าใดในอาเรย์)

3
ฉันจะเชื่อมตัวแปรเชลล์เข้ากับพารามิเตอร์อื่น ๆ ในบรรทัดคำสั่งของฉันได้อย่างไร
ฉันจะเชื่อมตัวแปรเชลล์เข้ากับพารามิเตอร์อื่น ๆ ในบรรทัดคำสั่งของฉันได้อย่างไร ตัวอย่างเช่น, #!/bin/sh WEBSITE="danydiop" /usr/bin/mysqldump --opt -u root --ppassword $WEBSITE > $WEBSITE.sql ฉันต้องเชื่อมต่อ.sqlกับ$WEBSITE

2
คำสั่ง idempotent ใดที่ฉันสามารถใช้เพื่อสร้าง symlink ให้ชี้ไปที่ไดเรกทอรี
ฉันต้องการใส่คำสั่งลงในเชลล์สคริปต์ซึ่งจะสร้าง symlink ไปยังไดเรกทอรี แต่สคริปต์นี้สามารถเรียกใช้ซ้ำแล้วซ้ำอีกดังนั้นในการเรียกใช้ครั้งต่อไปคำสั่งไม่ควรเปลี่ยนแปลงอะไร นี่คือโครงสร้างไดเรกทอรี: % tree /tmp/test_symlink /tmp/test_symlink ├── foo └── repo └── resources └── snippets ├── php.snippets ├── sh.snippets ├── snippets.snippets ├── sql.snippets └── vim.snippets ผมต้องการสร้าง symlink ในที่เรียกว่าตัวอย่างที่ชี้ไปยังไดเรกทอรีfoo/ ดังนั้นฉันวิ่ง:/tmp/test_symlink/repo/resources/snippets % ln -sfv /tmp/test_symlink/repo/resources/snippets /tmp/test_symlink/foo/snippets '/tmp/test_symlink/foo/snippets' -> '/tmp/test_symlink/repo/resources/snippets' ซึ่งให้ผลลัพธ์ที่ต้องการ % tree /tmp/test_symlink /tmp/test_symlink ├── foo │ └── snippets -> …

1
เชลล์แบบโต้ตอบสามารถกลายเป็นแบบไม่โต้ตอบหรือในทางกลับกันได้หรือไม่?
เชลล์แบบโต้ตอบสามารถกลายเป็นแบบไม่โต้ตอบหรือในทางกลับกันได้หรือไม่? หมายเหตุ:ผมเคยทำมากของการวิจัยเกี่ยวกับคำถามพื้นฐาน "ความแตกต่างระหว่างการโต้ตอบและไม่โต้ตอบอะไร" และผลการวิจัยของฉันทำให้ฉันถามนี้คำถาม คำถามนี้มีคำนำยาวส่วนหนึ่งเป็นเพราะมันเป็นสิ่งสำคัญสิ่งที่ประเภทของความหมายที่เราใช้สำหรับ "การโต้ตอบ" เพื่อที่จะตอบได้ คำจำกัดความอาจเป็นป้ายกำกับโดยพลการสำหรับบางชุด มันสามารถอธิบายคุณสมบัติต่าง ๆ ; หรืออาจให้ข้อมูลที่คุณสามารถใช้ในการทำนายพฤติกรรมและเข้าใจวัตถุประสงค์ ประเภทสุดท้ายนี้เราสามารถเรียกว่า "นิยามการกระทำ" หรือ "นิยามแบบไดนามิก" และเป็นประโยชน์มากที่สุด ในman 1p shนิยามของเชลล์เชิงโต้ตอบต่อไปนี้จะได้รับ: If the -i option is present, or if there are no operands and the shell’s standard input and standard error are attached to a terminal, the shell is considered to …


1
รอ bash-builtin เบิร์น CPU ที่ 100 เปอร์เซ็นต์
เกิดขึ้นอย่างน้อยในGNU bash รุ่น 4.3.42 x86_64 && GNU bash รุ่น 4.3.11 x86_64 ฉันใช้sleep & wait $!แทนวิธีง่าย ๆsleepในการทำให้sleepสัญญาณขัดจังหวะ(เหมือนSIGUSR1 ) แต่ดูเหมือนว่าwaitbash-builtin จะทำงานในลักษณะที่แปลกเมื่อคุณเรียกใช้สิ่งต่อไปนี้ อาคาร 1: cat <( trap 'echo SIGUSR1' SIGUSR1; echo $BASHPID; while :;do sleep 1 & wait $!; echo test; done )& อาคาร 2: kill -10 /the pid of the subshell, printed …

7
คำสั่งเพื่อแสดงการใช้งานหน่วยความจำการใช้ดิสก์และโหลด CPU
ฉันต้องการแสดงการใช้หน่วยความจำ, การใช้ดิสก์และโหลด CPU ในรูปแบบต่อไปนี้: Memory Usage: 33/512MB (6%) Disk usage: 4.2/20GB (23%) CPU Load: 0.01 ฉันจะทำอย่างไร

3
ข้อผิดพลาดสคริปต์ bash stty: อินพุตมาตรฐาน: ioctl ที่ไม่เหมาะสมสำหรับอุปกรณ์
ฉันใช้เอกสารที่นี่ในสคริปต์ทุบตีเพื่อทำการติดตั้งและตั้งค่าอัตโนมัติซึ่งต้องใช้รหัสผ่านหลายครั้ง ฉันป้อนรหัสผ่านหนึ่งครั้งและสคริปต์จะส่งไปยังคำสั่งต่างๆ ในกรณีส่วนใหญ่วิธีการที่นี่เอกสารจัดการปรับนี้ อย่างไรก็ตามในกรณีหนึ่งฉันได้รับข้อผิดพลาดนี้: Enter VNC password: stty: standard input: Inappropriate ioctl for device Verify password: stty: standard input: Inappropriate ioctl for device โปรดสังเกตว่าข้อความแสดงข้อผิดพลาดนี้มาจากx11vnc -storepassword(ไม่ใช่จากsudo) ปัญหาของฉันเกี่ยวข้องกับx11vnc -storepasswdและนี่คือรหัสของฉัน: sudo x11vnc -storepasswd ~/.vnc/passwd << ENDDOC password password y ENDDOC เห็นได้ชัดว่า (จากข้อผิดพลาด) ไม่ทำงาน ฉันขอขอบคุณตัวอย่างการทำงานของวิธีการใช้งานsudo x11vnc -storepasswd ~/.vnc/passwdในสคริปต์ ในกรณีที่ช่วยได้พรอมต์จะมีลักษณะดังนี้: ป้อนรหัสผ่าน VNC: ยืนยันรหัสผ่าน: เขียนรหัสผ่านไปที่ /home/user/.vnc/passwd? …

1
การดำเนินการสคริปต์ใน zsh - สิทธิ์ของไฟล์
ฉันสับสนเกี่ยวกับการอนุญาตให้ใช้ไฟล์ไม่ทำงานตามที่คาดไว้ อาจเป็นเพราะความคาดหวังของฉันผิด อย่างไรก็ตาม: ฉันมีไฟล์สคริปต์สำหรับความเรียบง่ายที่เรียกว่าเพียงแค่ตั้งอยู่ในs ~/binเพื่อประโยชน์ของตัวอย่างนี้ไฟล์มีเพียงบรรทัดต่อไปนี้: #!/bin/zsh echo "Test"; ง่ายมาก. ฉันนำทางไปยัง~/binไดเรกทอรีและchmodสิทธิ์ของแฟ้มของsการ400- คืออ่านอย่างเดียวสำหรับฉันเท่านั้น ไม่มีสิทธิ์ดำเนินการ ดังนั้นฉันจึงพยายามรันสคริปต์โดยป้อนเส้นทางของสิ่งนี้: % ./s zsh: permission denied: ./s จนถึงตอนนี้ดีมาก ไม่สามารถเรียกใช้ไฟล์ได้เนื่องจากการอนุญาตที่ไม่ถูกต้อง การกำหนดสิทธิ์การเข้าถึงให้เกิน500(เรียกใช้การอนุญาตที่ได้รับ) จะทำงานได้ดีเช่นกัน - ด้วยการอนุญาตเหล่านี้ไฟล์จะทำงานได้ดี: % ./s Test ทั้งหมดนี้เป็นไปตามที่คาดไว้ แต่ฉันก็chmodอนุญาตให้ย้อนกลับไปที่400(ดำเนินการอนุญาตอีกครั้ง) ลองsourceใช้ไฟล์และสิ่งนี้เกิดขึ้น: % source s Test แม้ว่าสิทธิ์จะเป็น 400สคริปต์จะดำเนินการ ดังนั้นนี่คือคำถามของฉัน: เหตุใดจึง./sล้มเหลว (เช่นควร) แต่source sดำเนินการตามปกติ สิ่งนี้ไม่ได้เป็นการทำลายวัตถุประสงค์ทั้งหมดของการอนุญาตให้ดำเนินการหรือไม่ ใน400สิทธิ์sh sและzsh sยังทำงาน ฉันแน่ใจว่าฉันกำลังทำหรือเข้าใจบางสิ่งผิดปกติอย่างน่ากลัว สามารถชี้คนออกที่ให้ฉันและอธิบายความแตกต่างระหว่าง./s, source s, …

4
กำลังประมวลผลตัวแปร bash ด้วย sed
ตัวแปร bash LATLNG มีค่าละติจูดและลองจิจูดในวงเล็บเหลี่ยมเช่นนั้น (53.3096,-6.28396) ฉันต้องการแยกคำเหล่านี้เป็นตัวแปรที่เรียกว่า LAT และ LON ซึ่งฉันกำลังพยายามทำผ่านทาง sed เช่นนั้น LAT=$(sed "s/(\(.*\),\(.*\))/\1/g" "$LATLNG") LON=$(sed "s/(\(.*\),\(.*\))/\2/g" "$LATLNG") อย่างไรก็ตามฉันได้รับข้อผิดพลาดต่อไปนี้: sed: can't read (53.3096,-6.28396): No such file or directory

4
วนรอบตัวแปร
ฉันกำลังเขียนสคริปต์ทุบตีเพื่อใช้ rsync และอัปเดตไฟล์บนเซิร์ฟเวอร์ที่แตกต่างกันประมาณ 20 แห่ง ฉันมีส่วน rsync ที่คิดออก สิ่งที่ฉันมีปัญหาคือต้องผ่านรายการตัวแปร สคริปต์ของฉันมีลักษณะเช่นนี้: #!/bin/bash SERVER1="192.xxx.xxx.2" SERVER2="192.xxx.xxx.3" SERVER3="192.xxx.xxx.4" SERVER4="192.xxx.xxx.5" SERVER5="192.xxx.xxx.6" SERVER6="192.xxx.xxx.7" for ((i=1; i<7; i++)) do echo [Server IP Address] done [Server IP Address]ค่าของตัวแปรที่เกี่ยวข้องควรอยู่ที่ไหน ดังนั้นเมื่อ i = 1 ฉันควร echo ค่าของ $ SERVER1 ฉันลองทำซ้ำหลายครั้งรวมถึง echo "$SERVER$i" # printed the value of i echo "SERVER$i" …


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