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

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

1
ssh รันคำสั่งอย่างไร
ฉันกำลังใช้ Bash กับทั้งลูกค้าและเซิร์ฟเวอร์ เมื่อรันคำสั่งผ่าน SSH: ssh <host> 'declare' ให้รายการของตัวแปรเชลล์ ssh <host> 'mount' ให้รายการของจุดเมานท์ อย่างไรก็ตามdeclareเป็น Bash builtin ในขณะที่mountเป็นคำสั่งภายนอก SSH จะรู้ได้อย่างไรว่าจะใช้งานอะไรถ้ามี shell builtin และคำสั่งภายนอกที่มีชื่อเดียวกันบนเซิร์ฟเวอร์?
15 shell  ssh 

1
วิธีกรองบรรทัดของเอาต์พุตคำสั่งที่เกิดขึ้นในไฟล์ข้อความ?
forbidden.txtสมมติว่าเรามีไฟล์ข้อความของสายที่ต้องห้าม วิธีสั้น ๆ ในการกรองทุกบรรทัดของเอาต์พุตคำสั่งที่มีอยู่ในไฟล์ข้อความคืออะไร? cat input.txt | exclude-forbidden-lines forbidden.txt | sort
15 shell  pipe  filter 

4
ทำไมเสียงสะท้อนจึงไม่เรียกว่า / bin / sh -c echo foo เอาท์พุทอะไรเลย
ตัวอย่างเช่นขณะที่ใช้งานได้: $ echo foo foo สิ่งนี้ไม่: $ / bin / sh -c echo foo ในขณะที่สิ่งนี้ทำ: $ / bin / sh -c 'echo foo; echo bar ' foo บาร์ มีคำอธิบายไหม?

7
เหตุใดจึงมีความแตกต่างในเวลาดำเนินการของเสียงก้องและแมว?
การตอบคำถามนี้ทำให้ฉันถามคำถามอื่น: ฉันคิดว่าสคริปต์ต่อไปนี้ทำสิ่งเดียวกันและอันที่สองควรเร็วกว่ามากเพราะการใช้ครั้งแรกcatที่ต้องการเปิดไฟล์ซ้ำไปซ้ำมา แต่อย่างที่สองเปิดไฟล์เท่านั้น เพียงครั้งเดียวและเพียงแค่ก้องตัวแปร: (ดูหัวข้อการปรับปรุงสำหรับรหัสที่ถูกต้อง) ครั้งแรก: #!/bin/sh for j in seq 10; do cat input done >> output ประการที่สอง: #!/bin/sh i=`cat input` for j in seq 10; do echo $i done >> output ในขณะที่อินพุตประมาณ 50 เมกะไบต์ แต่เมื่อฉันลองครั้งที่สองมันก็ช้าเกินไปเพราะการสะท้อนตัวแปรiเป็นกระบวนการที่ยิ่งใหญ่ ฉันยังมีปัญหากับสคริปต์ที่สองเช่นขนาดของไฟล์ที่ส่งออกต่ำกว่าที่คาดไว้ ฉันยังตรวจสอบหน้า man ของechoและcatเปรียบเทียบ: echo - แสดงบรรทัดข้อความ cat - เชื่อมไฟล์และพิมพ์บนเอาต์พุตมาตรฐาน แต่ฉันไม่ได้รับความแตกต่าง ดังนั้น: ทำไมแมวถึงเร็วขนาดนี้และเสียงก้องช้าในบทที่สอง? …

3
“ sudo: source: ไม่พบคำสั่ง”
$ source /etc/environment $ sudo source /etc/environment [sudo] password for t: sudo: source: command not found ดูเหมือนว่าเชลล์ที่แตกต่างจากที่bashใช้ในการดำเนินการsource /etc/environmentและเชลล์นั้นไม่มีsourceในตัว bashแต่ฉันและรากของเปลือกหอยเริ่มต้นมีทั้ง $ echo $SHELL /bin/bash ถ้าsudoindeeds ใช้เชลล์ที่ต่างกันทำไมมันถึงเป็นเช่นนั้น? ฉันเห็นคำตอบของ slmแต่ไม่เข้าใจในกรณีของฉัน
15 shell  sudo 

3
การปฏิบัติที่ดีที่สุดในการแสดงค่าบูลีนในเชลล์สคริปต์คืออะไร
ฉันรู้ว่ามีค่าบูลีนในbashแต่ฉันไม่เคยเห็นพวกเขาใช้ที่ใดก็ได้ ฉันต้องการเขียน wrapper สำหรับข้อมูลบางอย่างที่ค้นหาบนเครื่องของฉันเช่นมีการเสียบ / ติดตั้งไดรฟ์ USB นี้หรือไม่ อะไรคือวิธีปฏิบัติที่ดีที่สุดในการบรรลุเป้าหมาย สตริง? drive_xyz_available=true ตัวเลข (0 สำหรับจริง, ≠ 0 สำหรับเท็จ)? drive_xyz_available=0 # evaluates to true ฟังก์ชั่น? drive_xyz_available() { if available_magic; then return 0 else return 1 fi } ฉันส่วนใหญ่สงสัยเกี่ยวกับสิ่งที่คาดหวังโดยคนอื่นที่ต้องการใช้เสื้อคลุม พวกเขาจะคาดหวังว่าค่าบูลีนคำสั่งเช่นตัวแปรหรือฟังก์ชั่นที่จะเรียก? จากมุมมองด้านความปลอดภัยฉันคิดว่าตัวเลือกที่สองนั้นปลอดภัยที่สุด แต่ฉันชอบที่จะได้ยินประสบการณ์ของคุณ

6
วิธีรับไฟล์ N ล่าสุดในไดเรกทอรี?
ฉันมีไฟล์หลายไฟล์ที่เรียงลำดับโดยชื่อไฟล์ในไดเรกทอรี ฉันต้องการคัดลอกไฟล์ N สุดท้าย (พูด, N = 4) ไปยังโฮมไดเร็กตอรี่ของฉัน ฉันควรทำอย่างไร cp ./<the final 4 files> ~/

5
ฉันจะลบช่องว่างออกจากตัวแปรเชลล์ได้อย่างไร
ฉันทำต่อไปนี้ที่บรรทัดคำสั่ง: $ text="name with space" $ echo $text name with space ฉันพยายามที่จะใช้tr -d ' 'เพื่อลบช่องว่างและมีผลมาจาก: namewithspace ฉันพยายามทำบางสิ่งเช่น: text=echo $text | tr -d ' ' ไม่มีโชคดีหวังว่าคุณจะสามารถช่วยชาวพื้นบ้านที่ยอดเยี่ยม
15 shell  command-line  tr 

2
ข้อผิดพลาดทางไวยากรณ์ใกล้กับโทเค็นที่ไม่คาดคิด `('
เมื่อฉันใช้รหัสด้านล่างใน terminal SSH สำหรับ CentOS มันทำงานได้ดี: paste <(printf "%s\n" "TOP") แต่ถ้าฉันวางโค้ดบรรทัดเดียวกันในเชลล์สคริปต์ (test.sh) และรันเชลล์สคริปต์จากเทอร์มินัลมันจะพ่นข้อผิดพลาดเช่นนี้ ./test.sh: line 30: syntax error near unexpected token (' ./test.sh: line 30: paste <(printf "%s\n" "TOP") ฉันจะแก้ไขปัญหานี้ได้อย่างไร
15 shell 

2
ความแตกต่างที่แปลกประหลาดระหว่าง pwd และ / bin / pwd
ฉันเพิ่ม symlink ln -s . aaไปยังไดเรกทอรีปัจจุบันด้วย ถ้าผมดำเนินการcd aaและหลังจากที่ผมดำเนินการตอบสนองคือpwd/home/sim/aa แต่ถ้าฉันรัน/bin/pwdมันจะพิมพ์/home/sim(ไดเรกทอรีปัจจุบันไม่เปลี่ยนแปลง) ความแตกต่างนี้มาจากไหน?
15 shell  symlink  pwd 

5
รับไดเรกทอรีล่าสุด (ไม่ใช่ไฟล์ล่าสุด)
โฟลเดอร์ของฉันparentมีเนื้อหาดังต่อไปนี้: A.Folder B.Folder C.File มันมีทั้งโฟลเดอร์และไฟล์ภายใน B.Folderใหม่กว่านี้ ตอนนี้ฉันแค่อยากได้B.Folderฉันจะทำสิ่งนี้ได้อย่างไร ฉันลองสิ่งนี้ ls -ltr ./parent | grep '^d' | tail -1 แต่มันทำให้ฉันแต่ฉันเพียงแค่ต้องชื่อdrwxrwxr-x 2 user user 4096 Jun 13 10:53 B.FolderB.Folder
15 shell  files  ls  timestamps 

5
คัดลอกไฟล์ที่เล็กที่สุดก่อน?
ฉันมีไดเรกทอรีขนาดใหญ่ที่มีไดเรกทอรีย่อยและไฟล์ที่ฉันต้องการคัดลอกซ้ำ มีวิธีใดบ้างที่จะบอกcpว่าควรทำการคัดลอกตามขนาดไฟล์เพื่อให้ไฟล์ที่เล็กที่สุดถูกคัดลอกก่อน?
15 shell  cp  file-copy  size 

5
เรียกใช้คำสั่งเมื่อระบบไม่ได้ใช้งานและเมื่อใช้งานอีกครั้ง
ฉันต้องการเรียกใช้คำสั่งเมื่อผู้ใช้ไม่ได้ใช้งาน (ระบบไม่ได้ใช้งาน) ตัวอย่างเช่น: echo "You started to be inactive." นอกจากนี้เมื่อผู้ใช้กลับมาใช้งานอีกครั้ง (ระบบจะไม่ได้ใช้งานอีกต่อไป): echo "You started to be active, again." ฉันต้องการเชลล์สคริปต์ที่จะทำสิ่งนี้ สิ่งนี้เป็นไปได้หรือไม่ อาจจะมีเหตุการณ์ระบบบางอย่าง?
15 linux  bash  shell 

2
มีวิธีการใช้ xargs ข้ามท่อหรือไม่?
ฉันพยายามแปลงไฟล์ flac ที่ย้ายไปยังโฟลเดอร์เป็น mp3 ในโฟลเดอร์อื่นโดยอัตโนมัติ บรรทัดรหัสปัจจุบันของฉันคือ: inotifywait -m -r -q -e moved_to --format "'%w%f'" ~/test | xargs -I x flac -cd x - | lame -b 320 - /media/1tb/x.mp3 เพื่ออธิบายวิธีการใช้งานจนถึงตอนนี้ inotifywait จอภาพ ~ / ทดสอบวนซ้ำสำหรับไฟล์ที่ย้ายไปที่นั่นเอาท์พุทพา ธ และชื่อไฟล์ไปยังไพพ์ xargs ใช้ชื่อนั้นและสร้างคำสั่ง flac ที่เหมาะสมแทนที่ x ด้วยชื่อไฟล์และถอดรหัสไฟล์ไปยังไพพ์อื่น ในไปป์ใหม่ประมวลผลเอาต์พุตของ flac เป็น mp3 ภายใต้ / สื่อ …
15 shell  pipe  xargs  inotify 

3
วิธีการแสดงจำนวนบรรทัดที่ส่งออกโดยคำสั่งในเวลาจริง?
ฉันใช้svn exportเป็นส่วนหนึ่งของสคริปต์แพ็คเก็ตสำหรับแอปพลิเคชันของฉันและดูเหมือนว่าคำสั่งนี้เหมือนกับคนอื่น ๆ มากมายไม่มีแถบความคืบหน้าใด ๆ ฉันมีสองตัวเลือกในขณะนี้: ใช้งานโดยไม่มีตัวเลือกและดูการพิมพ์หลายพันบรรทัด ใช้--quietและไม่เห็นอะไรจนกว่ามันจะเสร็จสมบูรณ์ อย่างน้อยมีวิธีแสดงจำนวนบรรทัดเอาต์พุตตามคำสั่งแบบเรียลไทม์หรือไม่? เช่น: Exporting SVN directory ... 1234 files และเห็นการ1234 เพิ่มจำนวนนี้ในเวลาจริงหรือไม่ ฉันสามารถจินตนาการว่าการส่งออกไปยังคำสั่งที่จะทำแค่นี้ แต่อันไหน?

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