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

คำถามเฉพาะของ Bourne อีกครั้งของเชลล์ใน GNU เมื่อเทียบกับเชลล์ Bourne / POSIX อื่น ๆ สำหรับคำถามเกี่ยวกับเชลล์ Unix โดยทั่วไปให้ใช้ / เชลล์แท็กแทน

4
bash: / dev / stderr: การอนุญาตถูกปฏิเสธ
หลังจากอัปเกรดเป็นเวอร์ชั่นใหม่แล้วbashสคริปต์ของฉันก็เริ่มพ่นข้อผิดพลาด: bash: /dev/stderr: Permission denied ในเวอร์ชันก่อนหน้า Bash จะจำชื่อไฟล์เหล่านั้นได้ภายใน (ซึ่งเป็นสาเหตุที่คำถามนี้ไม่ซ้ำกับของไฟล์นี้ ) และทำสิ่งที่ถูกต้อง (tm)อย่างไรก็ตามสิ่งนี้หยุดทำงานทันที ฉันจะทำอย่างไรจึงจะสามารถเรียกใช้สคริปต์ของฉันอีกครั้งได้สำเร็จ ฉันได้ลองเพิ่มผู้ใช้ที่เรียกใช้สคริปต์ไปยังกลุ่มttyแต่มันก็ไม่ได้ทำให้แตกต่าง (แม้หลังจากออกจากระบบแล้ว) ฉันสามารถทำซ้ำนี้ในบรรทัดคำสั่งโดยไม่มีปัญหา: $ echo test > /dev/stdout bash: /dev/stdout: Permission denied $ echo test > /dev/stderr bash: /dev/stderr: Permission denied $ ls -l /dev/stdout /dev/stderr lrwxrwxrwx 1 root root 15 May 13 02:04 /dev/stderr -> /proc/self/fd/2 …

4
จะซ่อนข้อมูลกระบวนการเชลล์เมื่อเริ่มกระบวนการพื้นหลังได้อย่างไร
[USER@SERVER ~] sleep 3 & [1] 5232 [USER@SERVER ~] [1]+ Done sleep 3 [USER@SERVER ~] ฉัน / dev / null ทั้งสองข้อความได้อย่างไร: [1] 5232 [1]+ Done sleep 3 ps: ดังนั้นฉันต้องการผลลัพธ์ของกระบวนการ แต่ไม่ใช่สองบรรทัดที่กล่าวถึง!
19 bash  ubuntu 

7
เหตุใดกระบวนการพื้นหลัง Python ของฉันจึงสิ้นสุดลงเมื่อเซสชัน SSH ถูกยกเลิก
ฉันมีสคริปต์ทุบตีที่เริ่มต้นสคริปต์ python3 (เรียกมันว่าstartup.sh) โดยใช้บรรทัดสำคัญ: nohup python3 -u <script> & เมื่อฉันsshเข้าใช้งานโดยตรงและเรียกสคริปต์นี้สคริปต์ python ยังคงทำงานในพื้นหลังหลังจากที่ฉันออก อย่างไรก็ตามเมื่อฉันเรียกใช้สิ่งนี้: ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> "./startup.sh" กระบวนการจะสิ้นสุดลงทันทีที่sshดำเนินการเสร็จและปิดเซสชัน ความแตกต่างระหว่างสองคืออะไร? แก้ไข: สคริปต์หลามกำลังเรียกใช้บริการเว็บผ่านทางขวด แก้ไข 2: ฉันยังพยายามสร้างสคริปต์เริ่มต้นที่เรียกstartup.shและเรียกใช้ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> "sudo service start <servicename>"แต่ทำงานเหมือนเดิม แก้ไข 3: อาจเป็นอย่างอื่นในสคริปต์ นี่คือส่วนใหญ่ของสคริปต์: chmod 700 ${key_loc} echo "INFO: Syncing files." rsync -azP -e …

2
เชลล์สคริปต์ส่งข้อผิดพลาดที่ไม่พบเมื่อเรียกใช้จากไฟล์ sh แต่ถ้าป้อนด้วยตนเองคำสั่งจะทำงาน
ฉันพยายามใช้สคริปต์ต่อไปนี้เพื่อสร้างแผนผังเว็บไซต์สำหรับเว็บไซต์ของฉัน เมื่อฉันเรียกใช้เมื่อsh thsitemap.shฉันได้รับข้อผิดพลาดเช่นนี้และสร้างไฟล์ sitemap.xml ที่ว่างเปล่า: thsitemap.sh: 22: thsitemap.sh: [[: not found thsitemap.sh: 42: thsitemap.sh: [[: not found thsitemap.sh: 50: thsitemap.sh: Syntax error: "(" unexpected แต่ในฐานะผู้ใช้คนเดียวกันrootเมื่อฉันคัดลอกและวางบรรทัดเหล่านี้บนเทอร์มินัลด้วยตนเองมันทำงานได้โดยไม่มีข้อผิดพลาดใด ๆ และไฟล์ sitemap.xml มี URL ทั้งหมด มีปัญหาอะไร? ฉันจะแก้ไขสิ่งนี้ได้อย่างไร #!/bin/bash ############################################## # modified version of original http://media-glass.es/ghost-sitemaps/ # for ghost.centminmod.com # http://ghost.centminmod.com/ghost-sitemap-generator/ ############################################## url="techhamlet.com" webroot='/home/leafh8kfns/techhamlet.com' path="${webroot}/sitemap.xml" …

6
วิธีตรวจสอบว่าระบบไฟล์ติดตั้งด้วยสคริปต์หรือไม่
ฉันใหม่ในการเขียนสคริปต์ ... ฉันสามารถทำสิ่งพื้นฐานมาก แต่ตอนนี้ฉันต้องการมือ ฉันมีระบบไฟล์ในตัวเครื่องซึ่งจะติดตั้งเมื่อฉันต้องสำรองข้อมูลเท่านั้น ฉันเริ่มต้นด้วยสิ่งนี้ #!/bin/bash export MOUNT=/myfilesystem if grep -qs $MOUNT /proc/mounts; then echo "It's mounted." else echo "It's not mounted."; then mount $MOUNT; fi อย่างที่ฉันพูดฉันว่าพื้นฐานในการเขียนสคริปต์ ฉันได้ยินมาว่าคุณสามารถตรวจสอบสถานะของmountคำสั่งได้โดยดูที่รหัสส่งคืน RETURN CODES mount has the following return codes (the bits can be ORed): 0 success 1 incorrect invocation or permissions 2 …


3
การใช้ตัวแปรเชลล์สำหรับตัวเลือกคำสั่ง
ในสคริปต์ Bash ฉันพยายามจัดเก็บตัวเลือกที่ใช้rsyncในตัวแปรแยกต่างหาก ใช้งานได้ดีกับตัวเลือกง่าย ๆ (เช่น--recursive) แต่ฉันพบปัญหากับ--exclude='.*': $ find source source source/.bar source/foo $ rsync -rnv --exclude='.*' source/ dest sending incremental file list foo sent 57 bytes received 19 bytes 152.00 bytes/sec total size is 0 speedup is 0.00 (DRY RUN) $ RSYNC_OPTIONS="-rnv --exclude='.*'" $ rsync $RSYNC_OPTIONS source/ dest sending …
19 bash  variable 

3
ฉันจะสร้างไฟล์เปล่าใหม่ในสคริปต์ทุบตีได้อย่างไร
ฉันกำลังเรียกใช้สคริปต์ Perl ของบุคคลที่สามซึ่งเขียนว่ามันต้องการไฟล์เอาต์พุตสำหรับแฟล็กเอาท์พุท, -o. น่าเสียดายที่สคริปต์ดูเหมือนต้องการไฟล์จริงนั่นคือผู้ใช้ต้องสร้างไฟล์ว่างfilename.txtด้วย 0 ไบต์จากนั้นป้อนไฟล์เปล่านี้ในบรรทัดคำสั่งสคริปต์ perl script1.pl -o filename.txt คำถาม: ฉันจะสร้างไฟล์ว่างในสคริปต์ทุบตีได้อย่างไร หากพยายามเพียงครั้งperl script1.pl -o filename.txtเดียวสคริปต์จะแจ้งข้อผิดพลาดว่าไม่มีไฟล์อยู่

3
การเข้าถึงตัวแปรดัชนีอาร์เรย์จาก bash shell script loop?
ฉันต้องการเข้าถึงตัวแปรดัชนีอาเรย์ขณะวนลูปผ่านอาเรย์ในสคริปต์ bash shell ของฉัน myscript.sh #!/bin/bash AR=('foo' 'bar' 'baz' 'bat') for i in ${AR[*]}; do echo $i done ผลลัพธ์ของสคริปต์ด้านบนคือ: foo bar baz bat ผลลัพธ์ที่ฉันค้นหาคือ: 0 1 2 3 ฉันจะเปลี่ยนสคริปต์เพื่อให้บรรลุสิ่งนี้ได้อย่างไร

4
อาร์เรย์ JSON เพื่อทุบตีตัวแปรโดยใช้ jq
ฉันมีอาร์เรย์ JSON เช่นนั้น: { "SITE_DATA": { "URL": "example.com", "AUTHOR": "John Doe", "CREATED": "10/22/2017" } } ฉันต้องการวนซ้ำอาร์เรย์นี้โดยใช้ jq ดังนั้นฉันสามารถตั้งค่าคีย์ของแต่ละรายการเป็นชื่อตัวแปรและค่าตามที่เป็นค่า ตัวอย่าง: URL = "example.com" AUTHOR = "John Doe" CREATED = "2017/10/22" สิ่งที่ฉันได้ทำซ้ำไปเรื่อย ๆ จนถึงอาร์เรย์ แต่สร้างสตริง: constants=$(cat ${1} | jq '.SITE_DATA' | jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]") ผลลัพธ์ใด: URL=example.com AUTHOR=John Doe CREATED=10/22/2017 ฉันต้องการใช้ตัวแปรเหล่านี้เพิ่มเติมในสคริปต์: echo ${URL} …
19 bash  jq 

2
`ปฏิเสธ -h 'และ` nohup` ทำงานอย่างมีประสิทธิภาพเหมือนกันหรือไม่?
disown ทำให้เชลล์ไม่ส่ง SIGHUP ไปยังงานที่ถูกปฏิเสธเมื่อเชลล์ยกเลิกและ ลบงานที่ถูกปฏิเสธจากการควบคุมงานของเชลล์ ผลลัพธ์แรกของวินาทีคืออะไร? กล่าวอีกนัยหนึ่งถ้ากระบวนการที่เริ่มต้นจากเชลล์ถูกลบออกจากการควบคุมงานของเชลล์ไม่ว่าด้วยวิธีใดเชลล์จะไม่ส่ง SIGHUP ไปยังกระบวนการเมื่อเชลล์หยุดทำงานหรือไม่ disown -h ยังคงเก็บกระบวนการภายใต้การควบคุมงานของเชลล์ หมายความว่าdisown -hทำให้กระบวนการยังคงได้รับ SIGHUP ที่ส่งจากเชลล์ แต่ตั้งค่าการกระทำของ SIGHUP โดยกระบวนการให้เป็น "เพิกเฉย"? nohupที่ฟังดูคล้ายกับ $ sleep 123 & disown -h [1] 26103 $ jobs [1]+ Running sleep 123 & $ fg 1 sleep 123 $ ^Z [1]+ Stopped sleep 125 $ bg 1 …
18 bash  nohup  disown 


1
bash เปลี่ยนพฤติกรรมขึ้นอยู่กับค่าของตัวแปร“ IFS”
เมื่อฉันตั้งค่าIFSตัวแปรเป็นช่องว่างให้bashถือว่าหลายช่องว่างเป็นหนึ่งช่องว่าง ( myprogramเป็นโปรแกรมที่พิมพ์อาร์กิวเมนต์บรรทัดคำสั่งที่ได้รับ): IFS=" " x="hello hi world" ./myprogram $x argv[1] = hello argv[2] = hi argv[3] = world แต่เมื่อฉันตั้งค่าIFSตัวแปรเป็นเครื่องหมายจุลภาคbashไม่ถือว่าเครื่องหมายจุลภาคหลายรายการเป็นเครื่องหมายจุลภาคเดียว: IFS="," x="hello,,,hi,,,world" ./myprogram $x argv[1] = hello argv[2] = argv[3] = argv[4] = hi argv[5] = argv[6] = argv[7] = world ทำไมถึงเป็นอย่างนั้น?
18 bash  shell 

2
ทำความเข้าใจกับ `echo $ ((0x63)) '
echo $((0x63))ผมกำลังมองหาวิธีการแปลงเลขฐานสิบหกผ่านบรรทัดคำสั่งและพบว่ามีวิธีที่ง่ายมาก มันใช้งานได้ดี แต่ฉันสับสนเล็กน้อยกับสิ่งที่เกิดขึ้นที่นี่ ฉันรู้ว่า$(...)ปกติจะเป็น sub-shell โดยที่เนื้อหาจะถูกประเมินก่อนคำสั่ง outer มันยังเป็น sub-shell ในสถานการณ์นี้หรือไม่? ฉันไม่คิดว่าจะหมายถึงว่า sub-shell นั้นเพิ่งจะประเมิน(0x63)ว่าไม่ใช่คำสั่ง บางคนสามารถทำลายคำสั่งให้ฉันได้หรือไม่?
18 bash 

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" อะไรคือสาเหตุของสิ่งนี้? บรรทัดแรกเป็นเวอร์ชั่นที่ดี; หรือฉันควรสงสัยว่ามีข้อผิดพลาดที่ซ่อนอยู่ที่ไหนสักแห่งที่ทำให้เกิดพฤติกรรมนี้? …

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