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

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

7
ฉันจะพิมพ์อักขระ ASCII ด้วยจุดรหัสที่แตกต่างใน Bash ได้อย่างไร
ในตาราง ASCII มีอักขระ 'J' อยู่ซึ่งมีจุดรหัสในระบบตัวเลขต่าง ๆ : Oct Dec Hex Char 112 74 4A J มันเป็นไปได้ที่จะพิมพ์ถ่านนี้โดยจุดรหัสเลขฐานแปดโดยการพิมพ์ หรือprintf '\112' echo $'\112'ฉันจะพิมพ์ตัวละครเดียวกันโดยนำเสนอทศนิยมและเลขฐานสิบหกจุดได้อย่างไร?
12 bash  shell  ascii 

2
มาตรฐาน / แบบแผนอย่างเป็นทางการสำหรับส่วนขยายไฟล์สำหรับเชลล์สคริปต์ไปยังแหล่งที่มา
ฉันสงสัยว่ามีการประชุมสำหรับส่วนขยายประเภทไฟล์สำหรับเชลล์สคริปต์ที่คุณต้องการแหล่งที่มาแทนที่จะเรียกใช้ ตัวอย่างเช่น: ถ้าฉันต้องการเรียกใช้สคริปต์นี้ใน subshell ./script.sh ถ้าฉันต้องการจำรันสคริปต์นี้จากเปลือกปัจจุบัน . script.source มีแบบแผน (เช่น POSIX เป็นต้น) สำหรับประเภทไฟล์ในตัวอย่างที่สองหรือไม่? สิ่งที่ต้องการ.sourceหรือ.sourceme? ปรับปรุง คำถามนี้ไม่ได้ถามเกี่ยวกับความคิดเห็นใด ๆ ฉันระบุชัดเจนว่าฉันต้องการทราบว่ามีนามสกุลไฟล์มาตรฐานสำหรับสคริปต์ประเภทนี้หรือไม่ คำถามนี้ใช้ความคิดเห็นน้อยกว่าคำถามที่ได้รับการตอบรับดีในประเด็นที่คล้ายกัน ( ใช้ส่วนขยาย. sh หรือ. bash สำหรับสคริปต์ทุบตี? )

2
ทดสอบการรองรับอาร์เรย์โดยเชลล์
มีวิธีรัดกุมในการทดสอบเพื่อสนับสนุนอาร์เรย์โดยเชลล์คล้าย Bourne ในบรรทัดคำสั่งหรือไม่ สิ่งนี้เป็นไปได้เสมอ: $ arr=(0 1 2 3);if [ "${arr[2]}" != 2 ];then echo "No array support";fi หรือการทดสอบ$SHELLและรุ่นเปลือก: $ eval $(echo "$SHELL --version") | grep version จากนั้นอ่าน man page โดยสมมติว่าฉันสามารถเข้าถึงได้ (ถึงตรงนั้น, เขียนจาก/bin/bash, ฉันสมมติว่าเชลล์เหมือนบอร์นทั้งหมดยอมรับตัวเลือกแบบยาว--version, เมื่อแบ่งเช่น ksh เป็นต้น ) ฉันกำลังมองหาการทดสอบอย่างง่ายที่อาจไม่ต้องใส่ข้อมูลและรวมไว้ในส่วนการใช้งานที่จุดเริ่มต้นของสคริปต์หรือแม้กระทั่งก่อนที่จะเรียกมัน

1
การดักจับและ subshells โดยนัยในเชลล์สคริปต์
สมมติว่าคุณมีเชลล์สคริปต์ที่รันโค้ดการล้างข้อมูลบางประเภทผ่านEXITกับดักเช่นนี้: #!/bin/bash mytrap () { echo "It's a trap!" >&2 } trap mytrap exit echo I am at the end of the script. สิ่งนี้จะพิมพ์ออกมาIt's a trap!เมื่อสคริปต์ออก: $ sh myscript I am at the end of the script. It's a trap! คุณปรับเปลี่ยนสคริปต์เพื่อเพิ่มฟังก์ชั่นที่สร้างผลลัพธ์บางอย่างที่ได้รับการไพพ์ไปยังคำสั่งอื่นในท้ายที่สุดดังนี้: #!/bin/bash mytrap () { echo "It's a trap!" >&2 …
12 shell  trap 

2
bash find: รับไดเรกทอรีของไฟล์ที่พบ
ฉันมีโฟลเดอร์หลักชื่อ "parent_folder" ที่มีโฟลเดอร์ย่อยจำนวนมากในโฟลเดอร์ย่อยเหล่านี้เป็นไฟล์ชื่อ "foo.mp4" ฉันสามารถค้นหาไฟล์เหล่านี้ได้อย่างง่ายดายโดยทำสิ่งนี้: mymacbook:parent_folder username$ find ./ -name "foo.mp4" -exec echo {} \; ตอนนี้จะส่งคืนพา ธ ของแต่ละไฟล์โดยสัมพันธ์กับ parent_folder / ./path/to/foo.mp4 ฉันจะกลับไปยังเส้นทางที่ไม่มีชื่อไฟล์ได้อย่างไร
12 shell  find  osx 

4
การฆ่าเชลล์สคริปต์ทำงานในพื้นหลัง
ฉันได้เขียนเชลล์สคริปต์เพื่อตรวจสอบไดเรกทอรีโดยใช้ยูทิลิตี้ inotifywait ของ inotifyt-tools ฉันต้องการให้สคริปต์ทำงานอย่างต่อเนื่องในพื้นหลัง แต่ฉันยังต้องการที่จะหยุดมันเมื่อต้องการ เพื่อให้มันทำงานอย่างต่อเนื่องฉันใช้while true; แบบนี้: while true; do #a set of commands that use the inotifywait utility end ฉันได้บันทึกไว้ในไฟล์/binและทำให้สามารถใช้งานได้ เพื่อให้มันทำงานในพื้นหลังฉันใช้nohup <script-name> &และปิดสถานี ฉันไม่รู้ว่าฉันจะหยุดสคริปต์นี้ได้อย่างไร ฉันได้ดูคำตอบที่นี่และเป็นคำถามที่เกี่ยวข้องอย่างใกล้ชิดมากที่นี่ อัปเดต 1: บนพื้นฐานของคำตอบของ @InfectedRoot ด้านล่างฉันสามารถแก้ปัญหาของฉันโดยใช้กลยุทธ์ต่อไปนี้ ใช้ครั้งแรก ps -aux | grep script_name และใช้sudo kill -9 <pid>เพื่อฆ่ากระบวนการ จากนั้นฉันต้องpgrep inotifywaitและใช้sudo kill -9 <pid>อีกครั้งสำหรับรหัสที่ส่งคืน ใช้งานได้ แต่ฉันคิดว่านี่เป็นวิธีที่ยุ่งฉันกำลังมองหาคำตอบที่ดีกว่า …
12 bash  shell  kill  inotify 

3
grep: อินพุตไฟล์ 'X' เป็นเอาต์พุตเช่นกัน
ฉันใช้ubuntu 14.4และพยายามเปลี่ยนเส้นทางผลลัพธ์ของgrepคำสั่งไปยังไฟล์ แต่ฉันได้รับข้อผิดพลาดนี้: grep: input file 'X' is also the output ฉันค้นหาปัญหานี้แล้วและเพิ่งพบว่าเป็นข้อผิดพลาดubuntu 12.4และไม่มีคำอธิบายใด ๆ ใครสามารถช่วยฉันหาปัญหานี้ได้บ้าง ฉันเรียกใช้คำสั่งต่อไปนี้: grep -E -r -o -n r"%}(.*){%" > myfile

5
ไม่สามารถ ssh การเชื่อมต่อจะยุติลงทันทีด้วยสถานะออก 254
สิ่งล่าสุดที่ฉันจำได้คือเปลี่ยน ulimit memlock ที่นิ่มและแข็งเป็นไม่ จำกัด ตอนนี้ฉันไม่สามารถ ssh เข้าไปในเครื่องได้ นี่คือบันทึก ssh Authenticated to IP ([IP]:22). debug1: channel 0: new [client-session] debug2: channel 0: send open debug1: Requesting no-more-sessions@openssh.com debug1: Entering interactive session. debug2: callback start debug2: fd 3 setting TCP_NODELAY debug2: client_session2_setup: id 0 debug2: channel 0: request pty-req confirm 1 …
12 shell  ssh  ulimit 

4
การบันทึกโลคัลของคำสั่ง ssh ทั้งหมดแบบโลคัล?
ฉันจะเก็บบันทึกโลคัลที่บันทึกเวลาของคำสั่งรีโมตทั้งหมดที่ฉันใช้ในssh(ไคลเอ็นต์ openssh บรรทัดคำสั่งเริ่มต้นผ่านbash) ได้อย่างไร? ที่ต้องการ: ที่สำคัญ: ฝั่งไคลเอ็นต์ 100% โดยไม่ต้องอาศัยการบันทึกเซิร์ฟเวอร์ กำหนดค่าหรือติดตั้งต่อผู้ใช้พร้อมบันทึกที่จัดเก็บในโฮมไดเรกทอรีของผู้ใช้ การสนับสนุนสำหรับการแยกความแตกต่างระหว่างหลายเซสชันพร้อมกันกับผู้ใช้และโฮสต์ที่หลากหลาย ไม่รบกวน (ไม่จำเป็นต้องเปิดใช้งานในแต่ละครั้งและไม่รบกวนการใช้ ssh อย่างมีนัยสำคัญ) ลำดับความสำคัญสูง: เอาต์พุตไม่ถูกล็อกหรือกรองออกให้มากที่สุด รายการรหัสผ่านอย่างใดอย่างหนึ่งจะไม่ถูกบันทึกหรือไฟล์ถูกเข้ารหัส บ่งชี้ถึงคำสั่งจริงที่ใช้ (หลังจากแท็บ / ประวัติเสร็จสมบูรณ์, backspaces, CTRL+ C, ฯลฯ ... ถูกประมวลผลแล้ว) ยินดีที่ได้: ยังบันทึกคำสั่งในเซสชันที่ถูกล่ามโซ่ (คำสั่งที่ป้อนระหว่างระยะไกลsshหรือsu <user>เซสชัน) ควรเริ่มต้นเซสชันและสิ้นสุดเซสชัน ง่ายbash-based, การแก้ปัญหาที่ไม่ใช่รากจะดีที่สุด (บางทีอาจจะเป็นaliasหรือbashสคริปต์เสื้อคลุมสำหรับsshคำสั่ง?) ระดับความสามารถของฉัน: ฉันไม่ได้ใหม่กับการเขียนโปรแกรม แต่ยังคงเรียนรู้bashและ "วิธี Linux" ดังนั้นตัวอย่างโค้ดที่มีคำอธิบายสั้น ๆ จะได้รับการชื่นชมมากที่สุด กลยุทธ์ที่เป็นไปได้ keylogger - ปัญหา: บันทึกรหัสผ่านไม่บันทึกแท็บ / …


2
หนีคำพูดในนามแฝง zsh
จากคำถามนี้เกี่ยวกับการลอกบรรทัดใหม่ออกจากข้อความฉันต้องการเปลี่ยนให้เป็นนามแฝง zsh ดังนี้: alias striplines=' awk " /^$/ {print \"\n\"; } /./ {printf( \" %s \",$0);}"' ฉันได้พยายามหลีกเลี่ยงคำพูดในสคริปต์ awk แต่ฉันได้รับข้อผิดพลาดนี้: awk: (FILENAME=bspsrobustness FNR=1) fatal: division by zero attempted (ไฟล์นี้เรียกว่าbspsrobustness) มีวิธีทำสิ่งที่ฉันต้องการหรือไม่? ฉันคิดว่าฉันสามารถเปลี่ยนให้เป็นสคริปต์ awk แทนที่จะเป็น zsh alias นั่นเป็นตัวเลือกที่ดีที่สุดของฉันหรือไม่
12 shell  zsh  quoting  alias 

2
ทำความเข้าใจกับคำสั่ง shell builtin
ในคู่มือทุบตีมันเขียนไว้ว่า Builtin commands are contained >>> within <<< the shell itself นอกจากนี้คำตอบนี้ระบุว่า A built-in command is simply a command that the shell carries out itself, instead of interpreting it as a request to load and run some >>> other program <<< เมื่อผมทำงานcompgen -bเกี่ยวกับbash 4.4ผมได้รับรายชื่อของเปลือกทั้งหมดในตัวคำสั่ง ฉันเห็นตัวอย่างนั้น[และkillถูกระบุว่าเป็นเชลล์บิวด์อิน แต่สถานที่จริงของพวกเขาคือ: /usr/bin/[ /bin/kill ฉันคิดว่าเป็นbuiltinวิธีที่คำสั่งจะถูกรวบรวมเป็น/bin/bashปฏิบัติการ ดังนั้นสิ่งที่ทำให้ฉันสับสนจริงๆ: …

2
ตัวดำเนินการ '#' ที่ด้านหน้าของตัวแปรทำอะไรในการขยายตัวของตัวแปร
ด้านล่างเป็นรหัสที่ฉันเรียกใช้ในเทอร์มินัล [root@idm ~]# x="$(date +%d%m%y)" [root@idm ~]# echo $x 270217 [root@idm ~]# echo ${#x} 6 คนที่สามารถช่วยให้ฉันเข้าใจว่าทำไมออกเป็น6? สิ่ง#สำคัญที่ทำให้ตัวแปรคืออะไร?
12 shell 

2
สะท้อนสตริงที่มีตัวแปรอยู่ในนั้นโดยไม่ต้องขยาย / ประเมินค่ามัน [ปิด]
ปิด คำถามนี้ต้องการรายละเอียดหรือความคมชัด ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ เพิ่มรายละเอียดและชี้แจงปัญหาโดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 ปีที่แล้ว ฉันค้นหาทุกที่ สะท้อนเสียงและพิมพ์ พยายามเสนอราคาเดียวและสองครั้ง แต่ฉันมีการแยกวิเคราะห์ข้อมูลและกำหนดให้กับตัวแปรและต้องการประเมินถ้ามีตัวแปรอยู่ภายใน ฉันจะแทนที่ตัวแปรด้วยอักขระตัวแทนและค้นหาไฟล์ ตัวอย่าง: var="file.$DATE.txt" ### Where it goes wrong- Needs to identify that $DATE is within the $var varaible. test=$(echo "$var"|grep '\$') if [[ $test ]] then ### I would use whatever fix is discovered here as well test=$(echo $test|sed …
12 bash  shell  quoting 

2
เรียกใช้คำสั่งแบบขนานและรอให้กลุ่มคำสั่งกลุ่มหนึ่งเสร็จสิ้นก่อนเริ่มถัดไป
ฉันมีสคริปต์รวมถึงหลายคำสั่ง ฉันจะจัดกลุ่มคำสั่งให้ทำงานร่วมกันได้อย่างไร (ฉันต้องการสร้างกลุ่มคำสั่งหลายกลุ่มภายในแต่ละกลุ่มคำสั่งควรทำงานแบบขนาน (ในเวลาเดียวกัน) กลุ่มควรทำงานต่อเนื่องกันโดยรอกลุ่มหนึ่งให้เสร็จก่อนเริ่ม กลุ่มถัดไป) ... เช่น #!/bin/bash command #1 command #2 command #3 command #4 command #5 command #6 command #7 command #8 command #9 command #10 ฉันจะรันคำสั่งทุก ๆ 3 คำสั่งเพื่อ gether ได้อย่างไร? ฉันเหนื่อย: #!/bin/bash { command #1 command #2 command #3 } & { command #4 command …

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