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

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

2
ยกเว้นหนึ่งไดเรกทอรีในรูปแบบการจับคู่ `ls '
ฉันพยายามที่จะlsdirs ที่มี.pngไฟล์อยู่ภายใน (ไม่จำเป็นต้องเรียกซ้ำแม้ว่ามันจะมีประโยชน์พิเศษ) ยกเว้นหนึ่ง ยกเว้นหนึ่งไดเรกทอรีเช่น ls */*.png ทำงานได้ดี ls (^one)*/*.png ไม่ส่งคืน stdout ฉันจะประสบความสำเร็จได้อย่างไร ฉันตาบอดแล้วก็ส่งไปที่espeakดังนั้นฉันสามารถได้ยินได้แค่ตอนนี้เท่านั้น
13 shell  ls  wildcards 

2
เหตุใดฉันไม่สามารถโหลดโมดูลในขณะที่เรียกใช้งานสคริปต์ทุบตีของฉัน แต่เมื่อทำการจัดหาเท่านั้น
ฉันใช้โมดูลเพื่อควบคุมแพ็คเกจบนระบบของฉันและฉันได้python/2.7.2ติดตั้งเป็นโมดูล ฉันมีปฏิบัติการหลามง่ายpython_exe.pyที่ฉันจะโทรจากง่าย 'ขับรถ' runit.shสคริปต์ runit.shสคริปต์ดูเหมือนว่า: #!/bin/bash module load python/2.7.2 arg1=myarg1 arg2=15 arg3=$5 /path/to/python_exe.py -a $arg1 -b $arg2 -c $arg3 Howver เมื่อฉันเพิ่งเรียกใช้./runit.shมันขาย "โมดูล: คำสั่งไม่พบ" source runit.shอย่างไรก็ตามเมื่อฉันโหลดโมดูลอย่างถูกต้อง ทำไมนี้
13 bash  shell  python 

2
วิธีการใช้ getopt ในบรรทัดคำสั่ง bash มีตัวเลือกยาว ๆ เท่านั้น?
มีgetoptคำสั่งในบรรทัดคำสั่ง bash getoptสามารถใช้กับตัวเลือกสั้น ๆ (เช่นgetopt -o axby "$@") และสามารถใช้กับทั้งตัวเลือกแบบสั้นและแบบยาว (เช่นgetopt -o axby -l long-key -- "$@") แต่ตอนนี้ฉันต้องการตัวเลือกแบบยาวเท่านั้น (เช่นตัวเลือกแบบสั้นไม่มีอยู่จริง) อย่างไรก็ตามคำสั่งgetopt -l long-key -- "$@"ไม่ได้ แยกวิเคราะห์--long-keyตัวเลือกอย่างถูกต้อง ดังนั้นฉันจะใช้getoptคำสั่งด้วยตัวเลือกยาวเท่านั้นได้อย่างไร หรือมันเป็นไปไม่ได้หรือเป็นเพียงข้อผิดพลาดของgetoptคำสั่ง?
13 shell  command 

6
สิ่งที่ตรงกันข้ามของ echo -e?
หากฉันมีสตริงที่มีอักขระที่ไม่สามารถechoพิมพ์ได้บรรทัดใหม่หรือแท็บมีวิธีที่ฉันสามารถใช้พิมพ์สตริงนี้และแสดงรหัสสำหรับอักขระเหล่านี้ (เช่น\nสำหรับบรรทัดใหม่\bสำหรับ backspace) หรือไม่
13 shell  echo 

5
วิธีการจับข้อผิดพลาดในสคริปต์ทุบตีลินุกซ์?
ฉันทำสคริปต์ต่อไปนี้: # !/bin/bash # OUTPUT-COLORING red='\e[0;31m' green='\e[0;32m' NC='\e[0m' # No Color # FUNCTIONS # directoryExists - Does the directory exist? function directoryExists { cd $1 if [ $? = 0 ] then echo -e "${green}$1${NC}" else echo -e "${red}$1${NC}" fi } # EXE directoryExists "~/foobar" directoryExists "/www/html/drupal" สคริปต์ทำงานได้ แต่ข้างก้องของฉันก็มีเอาต์พุตเมื่อ cd …

4
นี่คือการพิมพ์ผิดในส่วนการเปลี่ยนเส้นทางของคู่มือทุบตีหรือไม่?
Note that the order of redirections is significant. For example, the command ls > dirlist 2>&1 directs both standard output and standard error to the file dirlist, while the command ls 2>&1 > dirlist directs only the standard output to file dirlist, because the standard error was duplicated from the …

5
รันคำสั่งเดียวกันอีกครั้งโดยใช้พารามิเตอร์อื่น
ฉันรู้ว่าฉันสามารถเรียกใช้คำสั่งต่อไปนี้ ls Some{File,Folder} และมันก็เทียบเท่ากับการรันสิ่งนี้: ls SomeFile SomeFolder (ฉันยังใช้มันเพื่อสิ่งต่าง ๆ เช่นmv place_{a,b}) อย่างไรก็ตามฉันสงสัยว่ามีทางลัดอื่นที่ฉันสามารถทำสิ่งนี้: run-command --a --whole --lot --of --flags parameter a; \ run-command --a --whole --lot --of --flags parameter b และฉันต้องพิมพ์run-command --a --whole --lot --of --flags parameter {a,b}หรืออะไรที่คล้ายกัน

8
ทำไมเทอร์มินัลเป็นกรณี ๆ
เมื่อฉันทำ - CD ..แทนที่จะcd .. ทำให้ฉันผิดพลาดว่า - CD: command not found ทำไมเทอร์มินัลคำนึงถึงขนาดตัวพิมพ์เมื่อมาถึงคำสั่ง linux? ฉันหมายความว่าคุณควรจะสามารถรันคำสั่งด้วยอักขระ "all uppercase" หรือ "all all lowercase" ฉันรู้ว่ามันเป็นเพราะเหตุผลบางอย่าง แต่ฉันแค่อยากรู้

2
การลบไฟล์ออกจากรายการแบบโต้ตอบ
ฉันต้องการลบรายการไฟล์และขอให้ยืนยัน รายการอยู่ในlist.txtไฟล์ ทำไมคำสั่งต่อไปนี้ทำงานไม่ถูกต้อง while read i; do rm -i $i; done < list.txt คำสั่งก่อนหน้าไม่รอฉัน แต่โชคดีที่ไม่มีไฟล์ถูกลบ ฉันกำลังใช้ Bash

1
netcat ในเชลล์สคริปต์ให้การเชื่อมต่อที่ไม่ถูกต้อง
ฉันมีเชลล์สคริปต์ที่ใช้netcatเพื่อฟังlocalhostบนพอร์ต 1111 สำหรับคำขอเว็บ ทุกครั้งที่ฉันลองเข้าถึงlocalhost:1111/index.htmlเช่นฉันจะได้รับ: invalid connection to [127.0.0.1] from localhost [127.0.0.1] 60038 จำนวนที่สิ้นสุด (60,038) localhostดูเหมือนว่าจะเพิ่มขึ้นทุกเวลาเข้าถึงฉัน ข้อเสนอแนะใด ๆ เกี่ยวกับสิ่งที่ผิดปกติ? และdefault localhostไดเรกทอรีคืออะไร? ฉันควรใส่index.htmlเพื่อที่localhost:1111/index.htmlจะทำงานอย่างไร แก้ไข นี่คือสคริปต์แบบเต็ม: #!/bin/sh while true do netcat -vvl localhost -p 1111 -c ' set -x read http_request echo HTTP/1.0 200 OK echo echo "Received HTTP request: $http_request" ' done

6
ลบแผนผังไดเรกทอรีว่าง (ลบไดเรกทอรีมากที่สุดเท่าที่จะทำได้ แต่ไม่มีไฟล์)
สมมติว่าฉันมีต้นไม้ dir เช่นนี้: ROOTDIR └--SUBDIR1 └----SUBDIR2 └----SUBDIR3 ฉันกำลังมองหาคำสั่งเช่นนั้นเมื่อฉันป้อน: $ [unknown command] ROOTDIR ต้นไม้ dir ทั้งสามารถลบได้ถ้าไม่มีแฟ้ม แต่ dirs ภายในต้นไม้ทั้ง อย่างไรก็ตามถ้ามีไฟล์ชื่อ hello.pdf ใต้ SUBDIR1: ROOTDIR └--SUBDIR1 └--hello.pdf └----SUBDIR2 └----SUBDIR3 จากนั้นคำสั่งจะต้องลบ SUBDIR2 และด้านล่างเท่านั้น
13 shell  directory  rm 

5
มีวิธีการดำเนินการไบนารีพื้นเมืองจากไปป์หรือไม่
echo 'main(){}' | gcc -xc - -o /dev/stdout | ??? มีวิธีรันไบนารีเอาต์พุตบนระบบที่เหมือนยูนิกซ์หรือไม่? แก้ไข:ฉันต้องการมันเพื่อเรียกใช้เอาต์พุตของ g ++ ในสภาพแวดล้อมแบบ sandbox ที่ฉันไม่สามารถเขียนไฟล์ใด ๆ (ไม่มีอันตรายฉันสัญญา)

2
Piping output จากโปรแกรม segfaulting
ฉันมีสคริปต์ที่เรียกใช้โปรแกรม (โดยเฉพาะttf2afmส่วนหนึ่งของ tetex 3.0) ซึ่งบางครั้ง segfaults และบางครั้งก็ไม่มี ข้อมูลที่ฉันต้องการจะพิมพ์ออกมาเสมอก่อนที่จะแยก segfaults แต่ฉันประสบปัญหาในการหยุดการเปลี่ยนเส้นทางไปป์จากความล้มเหลวและไม่ส่งออกข้อมูลใด ๆ ไปยังไพพ์เมื่อโปรแกรมล้มเหลว ฉันได้ลองเปลี่ยนเส้นทางผ่าน FIFO วงเล็บกระบวนการด้วยtrueตอนท้ายเรียกใช้จากฟังก์ชั่นเชลล์และการเข้ารหัสsh -cแต่ดูเหมือนว่าสคริปต์จะไม่ยอมให้กระบวนการส่งผลอะไรออกไป ฉันรู้ว่ามันมีความสามารถในการส่งออกเนื่องจากมันสามารถให้ได้อย่างสมบูรณ์จากบรรทัดคำสั่ง แต่ไม่ใช่จากสคริปต์ด้วยเหตุผลบางอย่าง คำถามของฉันคือมีวิธีใดบ้างที่สคริปต์จะเพิกเฉยต่อความจริงที่ว่าโปรแกรม segfaults และให้ผลลัพธ์กับฉันหรือไม่ ฉันใช้ BASH 4.1.10 (2) - ปล่อย

1
ตัวอธิบายไฟล์รั่วไหล
มันหมายความว่าอะไรถ้าไฟล์ descriptor รั่ว File descriptor 6 (socket:[901758]) leaked on lvextend invocation. Parent PID 10035: /bin/zsh File descriptor 9 (/dev/pts/1) leaked on lvextend invocation. Parent PID 10035: /bin/zsh File descriptor 11 (/dev/pts/1) leaked on lvextend invocation. Parent PID 10035: /bin/zsh File descriptor 12 (/dev/pts/1) leaked on lvextend invocation. Parent PID 10035: …
13 shell  lvm 

2
เปลี่ยนสีของพรอมต์ขึ้นอยู่กับผู้ใช้หรือรูทใน zsh
ใน zsh คุณสามารถมี%#ในPS1(หรือPROMPTตัวแปรอะไรก็ได้) ซึ่งโดยทั่วไปหมายถึงแสดง%ว่าผู้ใช้หรือแสดง#ถ้ารูต ฉันสงสัยว่ามีวิธีใดที่จะส่งผลกระทบต่อสิ่งนี้%หรือไม่หรือ#เปลี่ยนสีขึ้นอยู่กับว่าเป็นผู้ใช้หรือรูท (สีแดงสำหรับรูต, สีฟ้าสำหรับผู้ใช้) วิธีที่ชัดเจนคือการเปลี่ยนPS1ในรูทของฉัน~/.zshrcแต่พิจารณา นี่เป็นสัญลักษณ์พิเศษแล้วฉันสงสัยว่าอาจจะไม่มีวิธีที่ฉันสามารถใช้แบบเดียวกันPS1สำหรับทั้งสองได้ ... สิ่งที่เฉพาะเจาะจงสำหรับ%#มันสำหรับ zsh (ฉันแน่ใจว่ามีแฮ็กอื่น ๆ ที่ฉันสามารถทำได้เช่นกัน ถ้างบแล้ว)
13 shell  zsh  colors  prompt 

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