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

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

8
วิธีการลบเฉพาะเนื้อหาของไดเรกทอรี?
ฉันอยู่ในโฟลเดอร์: /var/myfolder. ข้างในมีโฟลเดอร์อื่น ๆ เช่น: /var/myfolder/A/ /var/myfolder/B/ `/var/myfolder/C/เป็นต้น ในแต่ละไฟล์มีชื่อสุ่ม ฉันจะลบไฟล์ทั้งหมดออกจากโฟลเดอร์ทั้งหมดภายในได้/var/myfolderอย่างไร โครงสร้าง (ไดเรกทอรีทั้งหมดเช่น., A, B, C, ฯลฯ/var/myfolder) ภายในควรจะยังคงเหมือนเดิม
14 shell  files 

3
การพิมพ์ทศนิยมให้เป็นอักขระ ASCII คำสั่งของฉันจะไม่แสดงผลตามที่ต้องการ
ฉันต้องการที่จะส่งออกสตริงของตัวละคร ASCII ทั้งหมดด้วยคำสั่งดังต่อไปนี้ for i in `seq 32 127`; do printf "%c" $i; done ผลลัพธ์ของคำสั่งข้างต้นคือ: 33333334444444444555555555566666666667777777777.............. เป็นตัวเลขตัวแรก (จากซ้าย) ของแต่ละหมายเลข เมื่อมองผ่านเว็บไซต์นี้ฉันได้พบกับคำตอบสำหรับปัญหาของฉันวิธีพิมพ์ตัวอักษร ASCII ที่พิมพ์ได้ทั้งหมดใน CLI? อย่างไรก็ตามฉันยังไม่เข้าใจว่าเพราะเหตุใดข้อมูลโค้ดต้นฉบับของฉันจึงไม่ส่งออกอักขระ ASCII ตามที่ต้องการ

4
Escape sequences ในเอาต์พุตของสคริปต์ที่เรียกจากแอ็พพลิเคชัน ncurses
ขณะนี้ฉันกำลังเรียกใช้ mcabber เป็นลูกค้า Jabber ของฉัน (ซึ่งใช้ ncurses) ในเซสชั่น tmux บน homeserver ของฉัน ในพื้นที่ฉันเรียกใช้ iTerm2 เป็นเทอร์มินัลอีมูเลเตอร์ซึ่งรองรับการกระตุ้นการแจ้งเตือนคำรามผ่านลำดับการหลีกเลี่ยงตัวละคร หมายเหตุ: ทั้งหมดechoในคำถามนี้ทำงานเหมือนprintf %bหรือecho -eในทุบตีและ echoGNU เช่นecho "\e]9;foobar\007"ทำให้ iTerm2 ส่งข้อความคำรามด้วยข้อความ "foobar" อย่างไรก็ตามเมื่ออยู่ในเซสชั่น tmux ลำดับการหลีกเลี่ยงจะถูกทำลาย ดังนั้นการใช้ลำดับ escape character ที่เป็นกรรมสิทธิ์\Ptmuxสามารถใช้ดังนี้: echo "\ePtmux;\e\e]9;foobar\007\e\\" สิ่งนี้ทริกเกอร์ข้อความคำรามจากภายในเซสชัน tmux อย่างไรก็ตามเมื่อฉันใช้สิ่งนี้ในสคริปต์เหตุการณ์ mcabber ของฉันที่ถูกไล่ออกเมื่อได้รับข้อความใหม่จะไม่มีการแจ้งเตือนใด ๆ ขึ้นมาราวกับว่าเสียงสะท้อนถูกส่งไปยังเทอร์มินัลผิด ฉันคิดว่าสิ่งนี้เกี่ยวข้องกับ mcabber ซึ่งเรียกสคริปต์ว่าเป็นแอปพลิเคชัน ncurses ดังนั้นผลลัพธ์จากสคริปต์ทุบตีปกติของฉันจะหายไปและ iTerm 2 ไม่เคยเห็นเลย ฉันพยายามโทร …

1
วิธีซ่อนคำสั่งที่พิมพ์ในเชลล์ Linux
มีวิธีซ่อนสิ่งที่ฉันพิมพ์ในเชลล์หรือไม่ดังนั้นเทอร์มินัลไม่ได้สะท้อนการกดแป้นของฉันในขณะที่ยังคงเอาท์พุทของคำสั่งหรือไม่ ตัวอย่างเช่นถ้าฉันรันip addr showสิ่งเดียวบนหน้าจอควรเป็นผลลัพธ์จากคำสั่งนั้นไม่ใช่ "ip addr show" ที่ฉันพิมพ์

1
ความคิดเห็นที่อ่านได้ในแต่ละบรรทัดในคำสั่ง bash แบบหลายบรรทัดพร้อมไพพ์ไลน์
เมื่อสร้างเชลล์สคริปต์โดยใช้ไพพ์ไลน์และการใช้แบ็กสแลชเพื่อดำเนินการต่อบรรทัดฉันต้องการแทรกความคิดเห็นบนบรรทัดแยกในแฟชั่นที่แข็งแกร่งอ่านได้และพกพาได้ ตัวอย่างเช่นให้ใช้คำสั่งหลายบรรทัดที่ไม่ใส่เครื่องหมาย (ถูกขโมยจาก @DigitalRoss เพื่อความชัดเจน): echo abc | tr a-z A-Z | sort | uniq ... ด้านล่างมีความสวยงามใกล้เคียงกับสิ่งที่ฉันต้องการให้สำเร็จ แต่ด้วยเหตุผลที่ชัดเจนไม่ทำงาน ... และใช่ฉันทราบดีว่านี่ไม่ใช่สิ่งที่ควรค่าแก่การแสดงความคิดเห็น: # Perform critical system task. # NOTE - An example of what does *not* work. echo abc | # Convert lowercase to uppercase. tr a-z A-Z | # Sort the …
14 bash  shell  pipe 

7
เชลล์สคริปต์สำหรับการย้ายไฟล์ที่เก่าที่สุด?
ฉันจะเขียนสคริปต์เพื่อย้ายไฟล์ที่เก่าที่สุดเพียง 20 ไฟล์จากโฟลเดอร์หนึ่งไปยังอีกโฟลเดอร์ได้อย่างไร มีวิธีที่จะคว้าไฟล์ที่เก่าแก่ที่สุดในโฟลเดอร์หรือไม่?

2
สิ่งที่ป้องกันไม่ให้ stdout / stderr จาก interleaving?
ว่าฉันใช้กระบวนการบางอย่าง: #!/usr/bin/env bash foo & bar & baz & wait; ฉันรันสคริปต์ด้านบนดังนี้: foobarbaz | cat เท่าที่ฉันสามารถบอกได้ว่าเมื่อใดก็ตามที่กระบวนการเขียนไปยัง stdout / stderr ผลลัพธ์ของมันจะไม่แทรกสอด - แต่ละบรรทัดของ stdio นั้นดูเหมือนจะเป็นอะตอม มันทำงานอย่างไร ยูทิลิตี้อะไรควบคุมวิธีแต่ละอะตอมเป็นอะตอม
14 shell  osx  stdout  output  stderr 

2
วิธีใช้ Bash สำหรับ sh ใน Ubuntu
ฉันกำลังติดตั้งโปรแกรมขนาดใหญ่ซึ่งมีทรัพยากรเป็นrpmไฟล์ มันติดอยู่ที่เส้นของ #!/bin/sh SCITEGICPERLBIN=`dirname $0` SCITEGICPERLHOME=`dirname $SCITEGICPERLBIN` if [ $SCITEGICPERLHOME == "." ] เห็นได้ชัดว่าshทำงานbashใน Red Hat Linux ด้วยไวยากรณ์นี้ แต่ให้ข้อผิดพลาดunexpected operatorใน Ubuntu ฉันไม่สามารถเปลี่ยนสคริปต์bashเป็นสคริปต์มาจากrpmแพ็คเกจ ฉันสามารถแยกและบรรจุหีบห่อใหม่rpmแต่อาจมีสคริปต์ดังกล่าวจำนวนมาก มีวิธีการเปลี่ยนค่าเริ่มต้นของเชลล์เพื่อใช้#!/bin/shเป็นbashหรืออย่างอื่นซึ่งสามารถจัดการกับ[โอเปอเรเตอร์ได้หรือไม่?

4
มีบางกรณีที่จำนวนช่องว่างมีความสำคัญในสคริปต์ทุบตี (หรือเชลล์อื่น ๆ )
ฉันได้รับแจ้งว่าช่องว่างมีความสำคัญในbashหรือเชลล์สคริปต์อื่น ๆ และฉันไม่ควรเปลี่ยนการมีอยู่ของช่องว่างเว้นแต่ว่าฉันรู้ว่าฉันกำลังทำอะไรอยู่ โดย "เปลี่ยนการดำรงอยู่" ฉันหมายถึงการแทรกช่องว่างระหว่างอักขระที่ไม่ใช่ช่องว่างสองตัวหรือลบช่องว่างระหว่างอักขระที่ไม่ใช่ช่องว่างสองตัวเช่นการเปลี่ยนvar="$val"เป็นvar ="$val"หรือกลับกัน ฉันต้องการถาม มีกรณีใดบ้างที่ใช้ช่องว่างเดียวหรือใช้ช่องว่างต่อเนื่องหลายรายการในเชลล์สคริปต์สร้างความแตกต่าง? . (แน่นอนการแทรก / ลบช่องว่างในเครื่องหมายคำพูดสร้างความแตกต่างเช่นเปลี่ยนจากecho "a b"เป็นecho "a b"หรือกลับกันฉันกำลังมองหาตัวอย่างนอกเหนือจากตัวอย่างเล็กน้อย) ฉันเจอคำถามนี้แล้วแต่มีอยู่เรื่องหนึ่งเกี่ยวกับการเพิ่มและลบช่องว่างระหว่างอักขระที่ไม่ใช่ช่องว่างสองตัวที่ฉันรู้ตัวอย่างมากมายว่ามันจะสร้างความแตกต่าง ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม รวมเปลือกหอยให้มากขึ้นถ้าเป็นไปได้

3
Bash script พร้อม `set -e` ไม่ได้หยุดอยู่ที่คำสั่ง` … && …… '
ฉันใช้set -eเพื่อหยุดทุบตีสคริปต์ในข้อผิดพลาดครั้งแรก ทำงานได้ดีทั้งหมดเว้นแต่ฉันจะใช้คำสั่งด้วย&&: $ cat script set -e cd not_existing_dir && echo 123 echo "I'm running! =P" $ $ ./script ./script: line 2: cd: not_existing_dir: No such file or directory I'm running! =P $ เมื่อเทียบกับ: $ cat script set -e cd not_existing_dir echo "I'm running! =P" $ $ ./script ./script: …

3
ต้องใช้อักขระใดในการหลบหนีในอาร์กิวเมนต์บรรทัดคำสั่ง
ใน Bash เมื่อระบุอาร์กิวเมนต์บรรทัดคำสั่งให้กับคำสั่งจำเป็นต้องใช้อักขระใดในการหลีกเลี่ยง พวกเขาจะถูก จำกัด ให้ metacharacters ของทุบตี: พื้นที่แท็บ |, &, ;, (, ), <และ>?
14 bash  shell  quoting 

1
exec 3 <& 1 ทำอะไร
ฉันเข้าใจว่าexecสามารถเปลี่ยนเส้นทาง I / O บนเชลล์ปัจจุบันได้ แต่ฉันเห็นการใช้งานเช่น: exec 6&lt;&amp;0 # Link file descriptor #6 with stdin. # Saves stdin. exec 6&gt;&amp;1 # Link file descriptor #6 with stdout. # Saves stdout. จากที่ฉันเข้าใจว่า&lt;มีไว้สำหรับอินพุตสตรีม&gt;สำหรับสตรีมเอาต์พุต แล้วจะexec 3&lt;&amp;1ทำอย่างไรดี? PS: ฉันพบสิ่งนี้จากซอร์สโค้ดของ Bats

5
การสร้างไดเรกทอรีจำนวนมากโดยใช้ mkdir
mkdirผมอยากจะสร้างไดเรกทอรีมากใช้ แต่ละชื่อไดเรกทอรีจะประกอบด้วยคำนำหน้า (สตริง) และดัชนี (จำนวนเต็ม) สมมติว่าฉันต้องการให้คำนำหน้าเป็น "s" และดัชนีอยู่ในช่วงตั้งแต่ 1 ถึง 50 ซึ่งหมายความว่าฉันต้องการสร้างไดเรกทอรีชื่อ: s1,, s2... s49,,s50 มีวิธีการทำสิ่งนี้โดยอัตโนมัติโดยใช้mkdirหรือไม่? ขอบคุณที่สละเวลา.
14 shell  directory 

5
รายการ X ไฟล์สุ่มจากไดเรกทอรี
มีวิธีในการแสดงรายการชุดของไฟล์ที่สุ่ม 30 ไฟล์จากไดเรกทอรีโดยใช้คำสั่ง Linux มาตรฐานหรือไม่? (ในzsh) คำตอบสูงสุดที่อธิบายไว้ที่นี่ไม่ทำงานสำหรับฉัน ( sortไม่รู้จักตัวเลือก-R)
14 shell  files  zsh 

1
ฉันสามารถ จำกัด ผู้ใช้ให้ใช้โปรแกรมพิเศษได้หรือไม่?
เป็นไปได้หรือไม่ที่จะเพิ่มผู้ใช้และ จำกัด ให้เรียกใช้โปรแกรมพิเศษ? ตัวอย่างเช่นหลังจากผู้ใช้รายนี้ลงชื่อเข้าใช้เขาสามารถเปิด Firefox เพื่อใช้อินเทอร์เน็ตเท่านั้นและไม่มีโปรแกรมอื่นที่สามารถเรียกใช้โดยผู้ใช้รายนี้ ตัวอย่างเช่นในเทอร์มินัลคำสั่งจะไม่สามารถเข้าถึงได้เมื่อคุณลบตัวแปรสภาพแวดล้อมบางอย่างเช่น $ HOME แต่เป็นไปได้ไหมที่จะหลีกเลี่ยงการรันโปรแกรมในเชลล์แบบกราฟิกเช่น Gnome ถ้าใช่เป็นอย่างไร

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