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

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

3
ฉันจะทดสอบความสอดคล้องของ POSIX ของเชลล์สคริปต์ได้อย่างไร
เมื่อพิจารณาว่า POSIX เป็นสิ่งที่ใกล้เคียงกับมาตรฐานทั่วไปมากที่สุดในบรรดา unices ทั้งหมดฉันสนใจที่จะรู้ว่ามีเชลล์ที่รองรับมันโดยเฉพาะหรือไม่ ในขณะที่เชลล์ที่ทันสมัยส่วนใหญ่ให้การสนับสนุน POSIX (และจะเรียกใช้สคริปต์ที่สอดคล้องกับ POSIX โดยไม่มีปัญหาใด ๆ ) พวกมันทำงานได้ไม่ดีในการชี้ให้เห็นคุณลักษณะที่ไม่เข้ากันได้ มีเชลล์ที่ใช้ POSIX และ POSIX เท่านั้นในลักษณะที่มันจะโยนข้อผิดพลาดสำหรับคุณสมบัติที่ไม่เข้ากันได้หรือไม่? แก้ไขฉันต้องการชี้แจงว่าฉันไม่ได้ขอคำแนะนำทั่วไปสำหรับการเขียนเชลล์สคริปต์แบบพกพา คำถามที่เกี่ยวข้องพูดถึงในความคิดเห็นที่ครอบคลุมนี้ ฉันคิดว่าคำถามนี้เมื่อฉันพบว่าbashมี--posixตัวเลือก แต่เพียงเพื่อค้นพบว่ามันมีผลต่อพฤติกรรมการทำให้มีลักษณะเฉพาะบางอย่างซึ่งไม่ใช่สิ่งที่ฉันกำลังมองหา

7
ฉันจะตรวจสอบคำขอ / การเชื่อมต่อขาออกทั้งหมดจากเครื่องของฉันได้อย่างไร
เครื่องของฉันเป็นเซิร์ฟเวอร์ดังนั้นฉันจึงต้องการละเว้นการเชื่อมต่อกับเซิร์ฟเวอร์ของฉัน (เช่นเมื่อมีคนเยี่ยมชมเว็บไซต์ของฉัน) ฉันต้องการเห็นเฉพาะการเชื่อมต่อ / คำขอที่เซิร์ฟเวอร์ของฉันทำกับสถานที่อื่น ฉันจะเห็นเฉพาะการเชื่อมต่อขาออกเหล่านั้นได้อย่างไร แก้ไข: ฉันใหม่กับสิ่งเหล่านี้ สิ่งที่ฉันพยายามทำคือดูว่ามีอะไรที่ส่งจากเซิร์ฟเวอร์ของฉันถูกส่งออกไปนอกเหนือจากข้อมูลสำหรับแอปพลิเคชันบนเว็บของฉัน ตัวอย่างเช่นหากมีคนเยี่ยมชมเว็บไซต์ของฉันแน่นอนเซิร์ฟเวอร์ของฉันจะส่งข้อมูลไปยังเบราว์เซอร์ของลูกค้า แต่สมมติว่ามีโค้ดอยู่ในกรอบของแอพพลิเคชั่นเว็บของฉันที่ส่งข้อมูลทางสถิติไปยังที่อื่นที่ฉันไม่ทราบ ฉันต้องการดูที่ที่เซิร์ฟเวอร์ของฉันกำลังส่งข้อมูลไปให้ถ้ามี อาจไม่น่าเป็นไปได้ แต่สมมติว่าคุณตัดสินใจใช้ php หรือ nodejs framework ที่คุณไม่ได้เขียน: มีโอกาสเล็กน้อยที่มันอาจส่งข้อมูลบางประเภท ถ้าอย่างนั้นนั่นคือสิ่งที่ฉันอยากเห็น

10
แสดงผลรวมของขนาดไฟล์ในรายการไดเรกทอรี
dirคำสั่งรายชื่อไดเรคทอรี Windows มีบรรทัดที่ท้ายแสดงจำนวนพื้นที่ทั้งหมดที่ใช้โดยไฟล์ที่แสดง ตัวอย่างเช่นdir *.exeแสดง.exeไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันขนาดและผลรวมทั้งหมดของขนาด ฉันชอบที่จะมีฟังก์ชั่นที่คล้ายกันกับdirนามแฝงของฉันในทุบตี แต่ฉันไม่แน่ใจว่าจะทำอย่างไร ขณะนี้ฉันมีalias dir='ls -FaGl'ในของฉัน.bash_profileแสดง drwxr-x---+ 24 mattdmo 4096 Mar 14 16:35 ./ drwxr-x--x. 256 root 12288 Apr 8 21:29 ../ -rw------- 1 mattdmo 13795 Apr 4 17:52 .bash_history -rw-r--r-- 1 mattdmo 18 May 10 2012 .bash_logout -rw-r--r-- 1 mattdmo 395 Dec 9 17:33 .bash_profile …
71 bash  shell-script  awk  ls 

8
#! / bin / bash - ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว
ฉันสร้างสคริปต์ทุบตี แต่เมื่อฉันพยายามเรียกใช้งานฉันจะได้รับ #!/bin/bash no such file or directory ฉันต้องการเรียกใช้คำสั่ง: bash script.shเพื่อให้สามารถใช้งานได้ ฉันจะแก้ไขสิ่งนี้ได้อย่างไร

6
ฉันจะตรวจสอบได้อย่างไรว่าเชลล์ควบคุมจาก SSH
ฉันต้องการตรวจจับจากเชลล์สคริปต์ (โดยเฉพาะอย่างยิ่ง. zshrc) หากมีการควบคุมผ่าน SSH ฉันลองตัวแปร HOST แต่มักจะเป็นชื่อของคอมพิวเตอร์ที่ใช้เชลล์อยู่เสมอ ฉันสามารถเข้าถึงชื่อโฮสต์ที่มาจากเซสชัน SSH ได้หรือไม่ การเปรียบเทียบทั้งสองจะช่วยแก้ปัญหาของฉัน ทุกครั้งที่ฉันเข้าสู่ระบบจะมีข้อความระบุเวลาเข้าสู่ระบบและโฮสต์ล่าสุด: Last login: Fri Mar 18 23:07:28 CET 2011 from max on pts/1 Last login: Fri Mar 18 23:11:56 2011 from max นี่หมายความว่าเซิร์ฟเวอร์มีข้อมูลนี้
69 ssh  shell-script  zsh 

9
แบ่งหน้าใน pdf
ฉันมีไฟล์ PDF ที่สแกนซึ่งสแกนสองหน้าในหน้าเสมือนหนึ่งหน้า (หน้าในไฟล์ PDF) ความละเอียดมีคุณภาพดี ปัญหาคือฉันต้องซูมเมื่ออ่านและลากจากซ้ายไปขวา มีคำสั่ง ( convert,, pdftk... ) หรือสคริปต์ที่สามารถแปลงไฟล์ pdf นี้เป็นหน้าปกติ (หนึ่งหน้าจากหนังสือ = หนึ่งหน้าในไฟล์ pdf)?

13
แก้ไขการล็อคในเชลล์สคริปต์หรือไม่
บางครั้งคุณต้องตรวจสอบให้แน่ใจว่ามีเพียงหนึ่งอินสแตนซ์ของเชลล์สคริปต์เท่านั้นที่ทำงานพร้อมกัน ตัวอย่างเช่นงาน cron ซึ่งดำเนินการผ่าน crond ที่ไม่มีการล็อคด้วยตนเอง (เช่น Solaris crond เริ่มต้น) รูปแบบทั่วไปที่จะใช้การล็อคคือรหัสดังนี้: #!/bin/sh LOCK=/var/tmp/mylock if [ -f $LOCK ]; then # 'test' -> race begin echo Job is already running\! exit 6 fi touch $LOCK # 'set' -> race end # do some work rm $LOCK แน่นอนรหัสดังกล่าวมีสภาพการแข่งขัน มีหน้าต่างเวลาที่การประมวลผลของทั้งสองอินสแตนซ์สามารถเลื่อนไปข้างหลังบรรทัดที่ 3 ก่อนที่จะสามารถแตะ$LOCKไฟล์ได้ สำหรับงาน …

4
ใน bash เป็นไปได้ไหมที่จะใช้ตัวแปรจำนวนเต็มในการควบคุมลูปของ for for loop
ฉันมีสคริปต์ทุบตีต่อไปนี้: #!/bin/bash upperlim=10 for i in {0..10} do echo $i done for i in {0..$upperlim} do echo $i done การforวนซ้ำครั้งแรก( โดยไม่มีตัวแปรupperlimในการควบคุมการวนซ้ำ) ทำงานได้ดี แต่การforวนซ้ำครั้งที่สอง( ด้วยตัวแปรupperlimในการควบคุมการวนซ้ำ) ไม่ทำงาน มีวิธีใดบ้างที่ฉันสามารถแก้ไขforลูปที่สองเพื่อให้ทำงานได้? ขอบคุณที่สละเวลา.
65 bash  shell  shell-script  for 

16
gpg ขอรหัสผ่านแม้จะมี - passphrase
ฉันคาดว่าคำสั่งต่อไปนี้เพื่อแยกไฟล์ gpg โดยไม่ต้องขอรหัสผ่าน: gpg --passphrase 1234 file.gpg แต่จะขอรหัสผ่าน ทำไม? สิ่งนี้มีพฤติกรรมเหมือนกัน: gpg --passphrase-file passfile.txt file.gpg ฉันใช้ Ubuntu กับ gnome 3 และจำไว้ว่ามันทำงานใน Fedora
65 shell-script  gpg 

9
สคริปต์สามารถเรียกใช้งานได้ แต่ไม่สามารถอ่านได้หรือไม่?
เป็นไปได้ไหมที่จะเรียกใช้งานสคริปต์หากไม่มีสิทธิ์ในการอ่าน ในโหมดรูทฉันสร้างสคริปต์และฉันต้องการให้ผู้ใช้รายอื่นเรียกใช้งานสคริปต์นี้ แต่ไม่ได้อ่าน ฉันไม่chmodอนุญาตให้อ่านและเขียน แต่อนุญาตให้ใช้งานได้ แต่ในโหมดผู้ใช้ฉันเห็นข้อความที่แจ้งว่า: สิทธิ์ถูกปฏิเสธ


7
เชลล์สคริปต์ล้มเหลว: ข้อผิดพลาดทางไวยากรณ์:“ (” ไม่คาดคิด
ฉันทำงานกับสคริปต์ที่ตั้งค่าสภาพแวดล้อมการพัฒนาโดยอัตโนมัติสำหรับการพัฒนา Raspberry Pi (รายละเอียดทีละขั้นตอนที่ทำงานอยู่ที่นี่ ) สคริปต์ที่มีการเชื่อมโยงในบทความนั้น แต่ความสะดวกของคุณสามารถค้นหาได้ที่นี่ยัง ตอนนี้เมื่อรันสคริปต์นี้ติดตั้งและตั้งค่าสภาพแวดล้อมโดยไม่มีข้อผิดพลาด แต่คุณต้องป้อนรหัสผ่าน sudo ของคุณมากกว่าหนึ่งครั้งเนื่องจากค่าการหมดเวลาของ sudo โดยค่าเริ่มต้น ดังนั้นฉันเริ่มทดลองโดยลบบรรทัด sudo ทั้งหมดและรันสคริปต์ทั้งหมดผ่าน sudo ที่บรรทัดคำสั่งดังนี้: kemra102@ubuntuvm:~$ sudo ./pi_dev_env_install.sh วิธีนี้ใช้งานได้ตามที่คาดหวังและได้รับประโยชน์สูงสุดจนถึงจุดนี้: ./pi_dev_env_install: 68: ./pi_dev_env_install.sh: Syntax error: "(" unexpected ตอนนี้บรรทัดนี้ใช้งานได้ดีก่อนหน้านี้เมื่อไม่ได้เรียกใช้สคริปต์ทั้งหมดด้วย sudo ไม่มีอะไรเกี่ยวกับบรรทัดนี้ที่ทำงานเหมือน sudo ที่ควรหยุดทำงานกับความรู้ของฉันไม่มีใครมีความคิดบ้างไหม?

5
ไม่สามารถเยื้อง heredoc เพื่อให้ตรงกับการเยื้องของการซ้อน
หากมี "ปัญหาโลกครั้งแรก" สำหรับการเขียนสคริปต์นี่จะเป็นเช่นนั้น ฉันมีรหัสต่อไปนี้ในสคริปต์ที่ฉันอัปเดต: if [ $diffLines -eq 1 ]; then dateLastChanged=$(stat --format '%y' /.bbdata | awk '{print $1" "$2}' | sed 's/\.[0-9]*//g') mailx -r "Systems and Operations <sysadmin@[redacted].edu>" -s "Warning Stale BB Data" jadavis6@[redacted].edu <<EOI Last Change: $dateLastChanged This is an automated warning of stale data for the UNC-G …

4
ค้นหาเจ้าของไดเรกทอรีหรือไฟล์ แต่เพียงคืนค่านั้นและไม่มีอะไรอื่น
ฉันกำลังมองหาคำสั่งที่จะส่งคืนเจ้าของไดเรกทอรีและเฉพาะที่ - เช่น regex แยกls -latคำสั่งหรือสิ่งที่คล้ายกัน? ฉันต้องการใช้ผลลัพธ์ในสคริปต์อื่น
62 shell-script  ls 

9
วิธีการวัดเวลาของการดำเนินการของโปรแกรมและเก็บไว้ในตัวแปร
เพื่อค้นหาว่าการดำเนินการบางอย่างภายในสคริปต์ Bash (v4 +) ใช้เวลานานเท่าใดฉันต้องการแยกเอาต์พุตจากtimeคำสั่ง "แยก" และ (ท้ายที่สุด) จับภาพภายในตัวแปร Bash ( let VARNAME=...) ตอนนี้ฉันกำลังใช้time -f '%e' ...(หรือมากกว่าcommand time -f '%e' ...เพราะในตัวของ Bash) แต่เนื่องจากฉันเปลี่ยนเส้นทางเอาต์พุตของคำสั่งที่ดำเนินการไปtimeแล้ว โดยทั่วไปปัญหาที่นี่คือที่จะแยกการส่งออกของtimeจากผลลัพธ์ของคำสั่งประหารชีวิต (s) สิ่งที่ฉันต้องการคือฟังก์ชั่นการนับจำนวนเวลาเป็นวินาที (จำนวนเต็ม) ระหว่างการเริ่มต้นคำสั่งและความสมบูรณ์ มันไม่จำเป็นต้องเป็นtimeคำสั่งหรือในตัวที่เกี่ยวข้อง แก้ไข:เนื่องจากคำตอบที่มีประโยชน์สองคำตอบด้านล่างนี้ฉันต้องการเพิ่มคำอธิบายสองคำ ฉันไม่ต้องการทิ้งเอาต์พุตของคำสั่งที่เรียกใช้แล้ว แต่มันจะไม่สำคัญว่ามันจะจบลงด้วย stdout หรือ stderr ฉันต้องการวิธีการโดยตรงมากกว่าหนึ่งทางอ้อม (เช่นการจับเอาท์พุทโดยตรงแทนที่จะเก็บไว้ในไฟล์ระดับกลาง) การแก้ปัญหาโดยใช้dateมาไกลถึงสิ่งที่ฉันต้องการ

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