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

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

3
เชลล์ดำเนินการโปรแกรมอย่างไร
หากฉันรวบรวมโปรแกรมโดยใช้ gcc และลองเรียกใช้งานจาก bash shell อะไรคือลำดับขั้นตอนที่แน่นอนตามด้วย bash เพื่อเรียกใช้งานมัน ฉันรู้fork(), execve(), loader, dynamic linker(และสิ่งอื่น ๆ ) มีส่วนร่วม แต่คนที่สามารถให้ลำดับขั้นตอนอย่างและบางส่วนอ้างอิงการอ่านที่เหมาะสม? แก้ไข: จากคำตอบดูเหมือนว่าคำถามอาจบ่งบอกถึงความเป็นไปได้มากมาย ฉันต้องการแคบลงเป็นกรณีง่ายๆ: (test.c เพียงพิมพ์ Hello world) $ gcc test.c -o test $ ./test สิ่งที่จะเป็นขั้นตอนในกรณีข้างต้น ( ./test) โดยเฉพาะที่เกี่ยวข้องกับโปรแกรมเริ่มต้นทุบตีในกระบวนการเด็กบางอย่างที่ทำโหลดเชื่อมโยง ฯลฯ ?

4
พิมพ์หน้าคนที่มีความกว้างคงที่
ด้วยคำสั่งตัวอย่าง man apropos > outputfile ไฟล์ข้อความจะถูกสร้างขึ้นซึ่งมีหน้าที่จัดรูปแบบmanของapropos(มีความแตกต่างเล็กน้อยเกี่ยวกับการman aproposพิมพ์โดยตรงบนหน้าจอเช่นตัวหนา) แต่ฉันต้องการตั้งค่าความกว้างบรรทัดสูงสุดของไฟล์เอาต์พุตที่สร้างขึ้นด้วยตนเองเพื่อให้ย่อหน้าทั้งหมดจะถูกปรับความกว้างนั้น manหน้าถูกสร้างขึ้นผ่านgroff: ตัวอย่างเช่นฉันพยายามวางไว้.ll 50ก่อนหน้าย่อหน้าของไฟล์ต้นฉบับดั้งเดิม.gz manแต่มันก็เล็กน้อยถ้าฉันต้องทำงานกับหลาย ๆmanหน้า ยิ่งไปกว่านั้นตัวละครทุกตัวไม่ได้รับการยอมรับ: apropos.1:45: warning: can't find character with input code 195 apropos.1:45: warning: can't find character with input code 168 apropos.1:47: warning: can't find character with input code 178 apropos.1:131: warning: can't find character with input code 169 …

3
ฉันควรใช้เครื่องหมายสแลชที่ส่วนท้ายของตัวแปรพา ธ ในเชลล์สคริปต์หรือไม่? [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 ปีที่แล้ว วันนี้เมื่อเขียนเชลล์สคริปต์ของฉัน ทันใดนั้นคำถามก็มาถึงใจฉัน ตั้งแต่cd /target_dirและcd /target_dir/ทั้งสองทำงาน ฉันควรเพิ่มเครื่องหมายสแลชที่ส่วนท้ายของตัวแปรพา ธ ของฉันในเชลล์สคริปต์หรือไม่ เช่นเมื่อเทียบกับLOG_PATH=/data/nginx/logsLOG_PATH=/data/nginx/logs/ ฉันทำการค้นหาขั้นต้นบน google แต่ไม่พบการสนทนาเกี่ยวกับสิ่งนี้บางทีมันอาจจะธรรมดาเกินไป สำหรับตอนนี้มันยากสำหรับฉันที่จะตัดสินใจเลือกสไตล์ แต่ฉันชอบLOG_PATH=/target_dir/สไตล์มากกว่านี้ เพราะเมื่อฉันกำลังเติมข้อความอัตโนมัติด้วยการทุบตีมันทำให้ฉันเห็นผลลัพธ์ด้วยเครื่องหมายทับ คุณมีความคิดเห็นเกี่ยวกับเรื่องนี้ทำไม

4
การออกจากเชลล์สคริปต์ด้วยลูปซ้อนกัน
ฉันมีเชลล์สคริปต์ที่มีลูปซ้อนกันและเพิ่งพบว่า "exit" ไม่ได้ออกจากสคริปต์จริงๆ แต่เป็นลูปปัจจุบันเท่านั้น มีวิธีการออกจากสคริปต์อย่างสมบูรณ์ในเงื่อนไขข้อผิดพลาดบางอย่างหรือไม่ ฉันไม่ต้องการใช้ "set -e" เนื่องจากมีข้อผิดพลาดที่ยอมรับได้และจะต้องเขียนใหม่มากเกินไป ตอนนี้ฉันกำลังใช้ kill เพื่อฆ่ากระบวนการด้วยตนเอง แต่ดูเหมือนว่าควรมีวิธีที่ดีกว่าในการทำเช่นนี้
11 bash  shell  scripting  exit 

2
วิธีจัดเก็บโฟลเดอร์ขนาดใหญ่ในไฟล์เดียวโดยไม่มีการบีบอัด
ฉันต้องการใช้โฟลเดอร์ 78gb และเก็บไว้ในไฟล์เดียว (สำหรับอัพโหลดไปยังบริการคลาวด์) ราวกับว่าฉันกำลังบีบอัดไว้ในไฟล์เก็บถาวร แต่ฉันไม่ต้องการการบีบอัดใด ๆ (ฉันไม่มี CPU มาก มีเวลา) มีอยู่หรือเปล่าที่ฉันสามารถทำสิ่งนี้ให้สำเร็จได้บางทีคำสั่งเทอร์มินัลที่ฉันไม่รู้

2
วิธีใช้ตัวแปรภายในเครื่องหมายคำพูดเดี่ยว
ฉันมีแอปพลิเคชันที่ใช้เป็นคุณลักษณะอินพุตในเครื่องหมายคำพูดคู่ฝังอยู่ในเครื่องหมายคำพูดเดี่ยว ยกตัวอย่างคำสั่งที่ถูกต้องนี้: command -p 'cluster="cl1"' เพื่อให้เป็นไปโดยอัตโนมัติฉันสร้างไฟล์ bash โดยใช้$CLUSTERเป็นตัวแปร ฉันควรสั่งการอย่างไร กล่าวอีกนัยหนึ่งฉันควรใส่อะไรแทน cl1 โปรดทราบว่าหากฉันแก้ไขคำสั่งข้างต้นคำสั่งนั้นจะไม่ได้รับการยอมรับ ตัวอย่างเช่น: command -p "cluster=cl1"ไม่ยอมรับ

3
ฉันจะตั้งค่า mtime ของไฟล์ในรูปแบบของยุคได้อย่างไร?
ฉันรู้วิธีรับไฟล์ mtime ในรูปแบบ epoch: stat --format=%Y <file> แต่ฉันไม่สามารถหาวิธีกำหนด mtime ของไฟล์ในรูปแบบยุค หน้าสัมผัส (1) หน้าคนดูเหมือนจะยอมรับค่า "การประทับเวลา" เท่านั้น (รูปแบบคงที่มากกว่าหรือน้อยกว่าซึ่งใช้เดือน, วัน, ชั่วโมง, minues, ฯลฯ ) หรือ "สตริงรูปแบบวันที่มนุษย์อ่านได้ฟรีส่วนใหญ่" มียูทิลิตี้อื่นที่ฉันควรจะตรวจสอบหรือไม่? ขอบคุณ

2
stderr มากกว่า ssh -t
สิ่งนี้จะส่งเอาต์พุตไปยัง STDERR แต่ไม่แพร่กระจายCtrl+ C(เช่นCtrl+ Cจะฆ่าsshแต่ไม่ใช่รีโมตsleep): $ ssh localhost 'sleep 100;echo foo ">&2"' สิ่งนี้แพร่กระจายCtrl+ C(เช่นCtrl+ Cจะฆ่าsshและห่างไกลsleep) แต่ส่ง STDERR ไปยัง STDOUT: $ ssh -tt localhost 'sleep 100;echo foo ">&2"' ฉันจะบังคับให้วินาทีส่งเอาต์พุต STDERR ไปยัง STDERR ในขณะที่ยังคงแพร่กระจายCtrl+ ได้Cอย่างไร พื้นหลัง GNU ใช้ขนาน 'SSH -tt' เพื่อเผยแพร่+Ctrl Cสิ่งนี้ทำให้สามารถฆ่างานที่กำลังรันอยู่ในระยะไกลได้ แต่ข้อมูลที่ส่งไปยัง STDERR ควรไปยัง STDERR ต่อไปเมื่อสิ้นสุดการรับ

3
ประวัติของทุบตี Bash
มีเหตุผลทางประวัติศาสตร์หรือไม่ทำไม Bash "globbing" และการแสดงออกปกติไม่เหมือนกัน? ตัวอย่างเช่นฉันเชื่อว่าใน Bash [1-2]*ตรงกับสิ่งที่เริ่มต้นด้วย 1 หรือ 2 ตามด้วยสิ่งอื่นในขณะที่นิพจน์ทั่วไป[1-2]*จะจับคู่เฉพาะลำดับที่ 1 และ 2 การเขียนสคริปต์ Bash และ REGEX ของฉันนั้นค่อนข้างอ่อนแอและฉันพบปัญหาที่เกี่ยวข้องกับความแตกต่างเหล่านี้เป็นประจำซึ่งทำให้ฉันสงสัยว่าทำไมพวกเขาถึงแตกต่างกัน


3
จะแสดงขนาดไฟล์ "ที่มนุษย์อ่านได้" ในผลลัพธ์การค้นหาได้อย่างไร
ฉันพยายามค้นหาไฟล์ขนาดใหญ่ทั้งหมดบนเซิร์ฟเวอร์ Centos ของฉัน ในการทำเช่นนั้นฉันกำลังใช้: find / -maxdepth 10 -size +100000 -ls ฉันลองเปลี่ยน-lsเป็น-lshแต่ไม่ได้รับอนุญาต ฉันจะแสดงผลลัพธ์เหล่านี้ด้วยขนาดที่มนุษย์อ่านได้ (โดยใช้คำต่อท้าย k, M, …) อย่างไร
11 shell  find  ls 

4
/ bin / etc / lib64 / root / sbin ถูกลบหรือย้ายโดยโฟลเดอร์ mv / * / * ในขณะที่ su
ระบบปฏิบัติการ Centos 6.5 64-bit ฉันดาวน์โหลดไฟล์ tar และต้องการยกเลิกการติดตั้งและmvมัน ฉันไม่ได้ทำการทดสอบแล้วโดยไม่ตั้งใจ (ขณะที่รูท) รันmv folder/* /*แทนที่จะmv folder/* .ทุบตีว่ามันไม่สามารถเขียนทับไฟล์บางไฟล์ได้จากนั้นจึงขออนุญาตจากผู้อื่น ฉัน ctrl-c'd ออกมา ฉันเปิดเซสชันเทอร์มินัลแล้ว แต่ออกsuแล้ว ตอนนี้ผมได้สูญเสียการเข้าถึงมากที่สุดshellคำสั่งไม่สามารถlsไดเรกทอรีใด ๆ suและไม่สามารถรับกลับไป เว็บเซิร์ฟเวอร์และบริการยังคงทำงานอยู่ ฉันสามารถเรียกใช้คำสั่งน้อยมากcdเป็นหนึ่งของพวกเขาและเมื่อฉันพยายามที่จะcdไป/etcหรือมันผิดพลาดกับ/binno directory found แก้ไขพบเพียงโฟลเดอร์ทั้งหมดหายไปจาก/( bin, etc, lib64, root, sbin) ได้ย้ายไปยัง/varไดเรกทอรีผมพยายาม/var/bin/suและได้รับ: -bash: /var/bin/su: /lib64/ld-linux-x86-64.so.2: bad ELF interpreter: No such file or directory
11 shell  centos 

7
จัดเรียงไฟล์ในไดเรกทอรีซ้ำตามวันที่แก้ไขล่าสุด
จัดเรียงไฟล์ในไดเรกทอรีซ้ำตามวันที่แก้ไขล่าสุด ฉันได้แก้ไขไฟล์จำนวนมากในไดเรกทอรีของฉันต้องการทราบว่าไฟล์เหล่านั้นคืออะไรโดยเรียงลำดับตามวันที่แก้ไขล่าสุดและฉันต้องการให้ส่วนขยายบางส่วนถูกแยกออก ในไดเรกทอรี svn ฉันมีไฟล์. svn จำนวนมากเช่นกันซึ่งฉันไม่ต้องการแสดงในการเรียงลำดับ
11 shell  scripting  find  sort 

3
วิธีรันคำสั่งซ้ำ ๆ ด้วยอาร์กิวเมนต์ที่ต่างกัน?
ฉันใช้ Ubuntu ฉันคัดลอกบางอาร์กิวเมนต์ (คั่นด้วย newline) และฉันสามารถใช้xselเพื่อพิมพ์ออกมาเช่นนี้ $ xsel arg1 arg2 arg3 arg4 ... ตอนนี้ฉันต้องการใช้แต่ละอาร์กิวเมนต์เหล่านี้สำหรับคำสั่งอื่นและดำเนินการคำสั่งนั้นหลายครั้งตามที่มีข้อโต้แย้ง ดังนั้นฉันจึงพยายาม $ xsel | mycommand "constantArgument" $1 อย่างไรก็ตามสิ่งนี้ดำเนินการmycommandสำหรับอาร์กิวเมนต์แรกเท่านั้น ฉันจะรันมันสำหรับทุก ๆ การโต้แย้งได้อย่างไร?

6
ท่อกึ่งอะซิงโครนัส
สมมติว่าฉันมีท่อต่อไปนี้: a | b | c | d ฉันจะรอให้เสร็จสิ้นการc(หรือb) ในshหรือbash? ซึ่งหมายความว่าสคริปต์dสามารถเริ่มต้นได้ตลอดเวลา (และไม่จำเป็นต้องรอ) แต่ต้องการเอาต์พุตที่สมบูรณ์จากcการทำงานอย่างถูกต้อง กรณีการใช้งานมีdifftoolไว้สำหรับgitเปรียบเทียบรูปภาพ มันถูกเรียกใช้โดยgitและต้องการประมวลผลอินพุต ( a | b | cส่วน) และแสดงผลลัพธ์ของการเปรียบเทียบ ( dส่วน) โทรจะลบการป้อนข้อมูลที่จำเป็นสำหรับการและa bซึ่งหมายความว่าก่อนที่จะส่งคืนจากสคริปต์กระบวนการc(หรือb) จะต้องยุติ ในทางกลับกันฉันไม่สามารถรอได้dเพราะนี่หมายความว่าฉันกำลังรอการป้อนข้อมูลจากผู้ใช้ ฉันรู้ว่าฉันสามารถเขียนผลของการcไปยังแฟ้มชั่วคราวหรืออาจจะใช้ FIFO bashใน (ไม่แน่ใจว่า FIFO จะช่วยได้หรือไม่) เป็นไปได้ไหมหากไม่มีไฟล์ชั่วคราวsh? แก้ไข อาจจะเพียงพอหากฉันสามารถหา ID กระบวนการของกระบวนการc(หรือb) ในแบบที่เชื่อถือได้ จากนั้นไพพ์ทั้งหมดสามารถเริ่มต้นแบบอะซิงโครนัสได้และฉันอาจรอรหัสกระบวนการ บางสิ่งบางอย่างตามแนวของ wait $(a | b | { c & …
11 bash  shell  pipe  fifo 

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