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

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

4
การรัน chsh ไม่เปลี่ยนเชลล์
ฉันต้องการเปลี่ยนเชลล์จาก bash เป็น zsh ฉันได้ลองใช้งานสิ่งต่อไปนี้ขณะที่ล็อกอินในฐานะผู้ใช้ของ zol: $ chsh -s /bin/zsh $ sudo chsh -s /bin/zsh zol $ su -c 'chsh -s /bin/zsh zol' # The above all results with: $ password: $ chsh: Shell not changed. # zsh exists in /etc/shells.. chsh -l /bin/sh /bin/bash /sbin/nologin /bin/zsh มีอะไรผิดปกติ? ฉันจะแก้ไขได้อย่างไร
19 shell  zsh  users 

2
-q ปิดการบันทึกผลลัพธ์ของ wget หรือไม่?
ขณะนี้ฉันมีสคริปต์เชลล์ทำงานบนเซิร์ฟเวอร์ linux ซึ่งใช้ wget in oder เพื่อดาวน์โหลดเว็บเพจระยะไกล ในทางกลับกันนี้จะถูกดำเนินการโดยงาน cron ซึ่งมีกำหนดที่จะทำงานในบางช่วงเวลา บางคนได้โปรดยืนยันว่าการเพิ่ม-qตัวเลือกไม่เพียง แต่จะหยุดการส่งออกทั้งหมดที่ส่งคืนไปยังคอนโซล แต่ยังจะหยุดความพยายามทั้งหมดโดยการเขียนบันทึกหรือลองสร้างไฟล์บันทึกหรือไม่
19 linux  shell  wget 

2
ความหมายของคำพูดเดี่ยวและคู่ในตัวแปรสภาพแวดล้อมคืออะไร?
ฉันกำหนดตัวแปรสภาพแวดล้อมบางอย่างใน. profile ของฉันเช่นนี้: MY_HOME="/home/my_user" แต่ดูเหมือนว่าตัวแปรจะไม่ประเมินเว้นแต่ว่าฉันจะตัดเครื่องหมายคำพูดออกแล้วทำการซอร์สไฟล์อีกครั้ง ฉันเชื่อว่าจำเป็นต้องมีเครื่องหมายอัญประกาศหากจะมีช่องว่างและใช้เครื่องหมายอัญประกาศเดี่ยวหากไม่ต้องการ Escape บางคนสามารถอธิบายความสำคัญของคำพูดเดี่ยวและคู่ในคำจำกัดความของตัวแปรได้หรือไม่? เห็บหน้าและเห็บหลังเหรอ?


6
ค้นหาค่าสูงสุดของคอลัมน์ 1 และพิมพ์ระเบียนที่เกี่ยวข้องจากคอลัมน์ 2 จากไฟล์
วิธีค้นหาค่าสูงสุดจากคอลัมน์ 1 และ echo ตำแหน่งพา ธ ตามลำดับจากไฟล์ที่มีจำนวนเรคคอร์ด $ cat version.log 112030 /opt/oracle/app/oracle/product/11.2.0 121010 /opt/oracle/app/oracle/product/12.1.0 ผลลัพธ์ที่คาดหวัง: /opt/oracle/app/oracle/product/12.1.0

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" …


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

4
วิธีการแตกสตริงที่ยาวเป็นหลายบรรทัดในพร้อมต์ read -p ภายในซอร์สโค้ด?
/bin/shฉันจะเขียนสคริปต์การติดตั้งที่จะใช้เป็น มีบรรทัดแจ้งให้ไฟล์: read -p "goat can try change directory if cd fails to do so. Would you like to add this feature? [Y|n] " REPLY ฉันต้องการแบ่งบรรทัดยาวเป็นหลายบรรทัดเพื่อไม่ให้มีเกิน 80 อักขระ ฉันกำลังพูดถึงบรรทัดภายในซอร์สโค้ดของสคริปต์ ไม่เกี่ยวกับบรรทัดที่จะพิมพ์จริงบนหน้าจอเมื่อสคริปต์ถูกดำเนินการ! สิ่งที่ฉันได้ลอง: วิธีการเริ่ม: read -p "goat can try change directory if cd fails to do so. " \ "Would you like …

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 ฉันจะเปลี่ยนสคริปต์เพื่อให้บรรลุสิ่งนี้ได้อย่างไร

1
เหตุใด $ {$ #} จึงให้ผลลัพธ์แบบเดียวกันกับ $$ ในเชลล์
ขณะที่พยายามที่จะได้รับที่ผ่านมาชุดพารามิเตอร์ตำแหน่งในฉันได้พยายาม/bin/dash echo ${$#}น่าแปลกที่นี่ไม่ได้ส่งผลให้เกิดข้อผิดพลาด แต่เป็น PID ซึ่งเหมือนกับ$$เนื้อหาตัวแปร คำถามทำไมไวยากรณ์นั้นถึงใช้ได้? กฎไวยากรณ์ที่เชลล์ใช้ในที่นี้คืออะไร โดยทั่วไปสิ่งที่ฉันทำคือ $ set 1 2 3 4 5 $ echo ${$#} 13819 $ echo $$ 13819 เห็นได้ชัดว่า%ตัวละครยังได้รับการละเว้นในโครงสร้างดังกล่าว $ echo ${$%} 13819 แต่*และ@ส่งผลให้เกิดข้อผิดพลาดในการทดแทนที่ไม่ดี: $ echo ${$*} sh: 10: Bad substitution $ echo ${$@} sh: 11: Bad substitution
18 shell  variable 

2
เหตุใด POSIX จึงต้องมีเชลล์ในตัวเพื่อให้มีการใช้งานภายนอก
จากคำถามนี้เกี่ยวกับว่าเป็น printf ในตัวสำหรับ Yashมาคำตอบนี้ว่าคำพูดมาตรฐาน POSIX คำตอบนั้นชี้ให้เห็นว่าลำดับการค้นหา POSIX คือการค้นหาการนำไปใช้ภายนอกของคำสั่งที่ต้องการและจากนั้นหากเชลล์นำมาใช้เป็นแบบบิวด์อินให้รันบิวด์อิน (สำหรับบิวด์อินที่ไม่ใช่บิวด์อินพิเศษ) เหตุใด POSIX จึงมีข้อกำหนดนี้เพื่อให้มีการใช้งานภายนอกอยู่ก่อนที่จะอนุญาตให้มีการใช้งานภายในได้ ดูเหมือน ... โดยพลการดังนั้นฉันอยากรู้


4
“ เรียกใช้คำสั่งใด ๆ ซึ่งจะส่งผ่านข้อมูลที่ไม่น่าเชื่อถือไปยังคำสั่งที่ตีความข้อโต้แย้งเป็นคำสั่ง”
จากคู่มือของ findutils: ตัวอย่างเช่นการสร้างเช่นสองคำสั่งเหล่านี้ # risky find -exec sh -c "something {}" \; find -execdir sh -c "something {}" \; อันตรายมาก เหตุผลนี้คือ '{}' ถูกขยายเป็นชื่อไฟล์ซึ่งอาจมีเครื่องหมายอัฒภาคหรืออักขระอื่น ๆ ที่พิเศษสำหรับเชลล์ หากตัวอย่างมีคนสร้างไฟล์ /tmp/foo; rm -rf $HOMEคำสั่งสองคำสั่งด้านบนสามารถลบโฮมไดเร็กตอรี่ของใครบางคนได้ ดังนั้นด้วยเหตุนี้จึงไม่เรียกใช้คำสั่งใด ๆ ซึ่งจะส่งผ่านข้อมูลที่ไม่น่าเชื่อถือ (เช่นชื่อของไฟล์ les) ไปยังคำสั่งที่ตีความอาร์กิวเมนต์เป็นคำสั่งที่จะตีความเพิ่มเติม (เช่น 'sh') ในกรณีของเชลล์มีวิธีแก้ไขปัญหาที่ฉลาดสำหรับปัญหานี้: # safer find -exec sh -c 'something "$@"' sh {} \; …
18 shell 

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 

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