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

Bash คือ Bourne Again SHell ผู้สืบทอดมาจาก Unix sh (shell) คลาสสิก

3
#! / bin / sh vs #! / bin / bash เพื่อความสะดวกในการพกพาสูงสุด
ฉันมักจะทำงานร่วมกับเซิร์ฟเวอร์ Ubuntu LTS ซึ่งจากสิ่งที่ฉันเข้าใจ symlink ไป/bin/sh /bin/dashจำนวนมากของ distros อื่น ๆ แม้ว่า symlink ไป/bin/sh/bin/bash จากที่ฉันเข้าใจว่าถ้าสคริปต์ใช้#!/bin/shด้านบนมันอาจไม่ทำงานแบบเดียวกันบนเซิร์ฟเวอร์ทั้งหมดหรือไม่ มีแนวทางปฏิบัติที่แนะนำให้เชลล์ใช้สำหรับสคริปต์เมื่อต้องการความสะดวกในการพกพาสูงสุดของสคริปต์เหล่านั้นระหว่างเซิร์ฟเวอร์หรือไม่?
36 linux  bash  shell  sh 

2
เหตุใดการเปลี่ยนเส้นทาง 'สคริปต์' ไปยัง / dev / null / อนุญาตให้ 'หน้าจอ' ทำงานในขณะที่ผู้ใช้อื่นเป็นผู้ใช้
ฉันถูก su'ed เป็นผู้ใช้เพื่อเรียกใช้สคริปต์ยาวเฉพาะ ฉันต้องการใช้หน้าจอ แต่ได้รับข้อความแสดงข้อผิดพลาด "ไม่สามารถเปิด terminal '/ dev / pts / 4' - โปรดตรวจสอบ" ดังนั้นผมจึง Googled ไปรอบ ๆ $ script '/dev/null/'และมาข้ามโพสต์ฟอรั่มที่ได้รับคำสั่งให้วิ่ง ฉันทำเช่นนั้นแล้วฉันจะกลั่นกรอง ทำไมจึงใช้งานได้ หน้าจอนั้นกำลังทำอะไรซูไม่สามารถทำงานในฐานะผู้ใช้ที่เป็นผู้ใช้งานได้? เหตุใดการส่ง 'สคริปต์' ไปยัง / dev / null อีกครั้งจึงถูกป้องกันอย่างอื่น ใช้สคริปต์เพื่อเขียนบันทึกในฐานะผู้ใช้ดั้งเดิมไปยังที่อื่นหรือไม่?
36 linux  bash  gnu-screen  su 

4
bash: ตัวแปรสูญเสียค่าเมื่อสิ้นสุดการอ่านลูป
ฉันมีปัญหากับหนึ่งในสคริปต์เชลล์ของฉัน ถามเพื่อนร่วมงานไม่กี่คน แต่พวกเขาทั้งหมดเพิ่งส่ายหัว (หลังจากมีรอยขีดข่วน) ดังนั้นฉันจึงมาที่นี่เพื่อหาคำตอบ ตามความเข้าใจของฉันเชลล์สคริปต์ต่อไปนี้ควรพิมพ์ "Count is 5" เป็นบรรทัดสุดท้าย ยกเว้นว่ามันจะไม่ มันพิมพ์ "นับเป็น 0" หาก "ขณะที่อ่าน" ถูกแทนที่ด้วยลูปชนิดอื่นมันก็ใช้ได้ดี นี่คือสคริปต์: echo "1"> input.data echo "2" >> input.data echo "3" >> input.data echo "4" >> input.data echo "5" >> input.data CNT = 0 cat input.data | ในขณะที่อ่าน ทำ ให้ CNT ++; echo "นับเป็น …
36 bash  scope 

7
สร้าง 'ไฟล์เสมือน' จากคำสั่ง bash หรือไม่
ฉันสงสัยว่ามีวิธีการสร้าง 'ไฟล์เสมือน' จาก bash output หรือไม่ ตัวอย่าง: สมมติว่าฉันต้องการส่งออกอีเมลmysqldumpเป็นไฟล์แนบไปยังที่อยู่อีเมลภายนอก ฉันสามารถใช้ Mutt ในการทำเช่นนั้นได้ ตัวเลือกที่ฉันจำเป็นต้องใช้งานmutt -a <name of the file I want to attach>ฉันรู้ว่าฉันสามารถใช้ไฟล์ชั่วคราว: mysqldump mysqldumpoptions > /tmp/tempfile && mutt -a /tmp/tempfile admin@example.org แต่ฉันอยากจะเปลี่ยนเส้นทางmysqldumpผลลัพธ์โดยตรงไปยัง Mutt แทน -aตัวเลือกของ Mutt ยอมรับเฉพาะไฟล์และไม่ใช่สตรีม แต่อาจมีวิธีส่งไฟล์ descriptor เสมือนหรืออะไรบางอย่างตามบรรทัดเหล่านั้น สิ่งที่ต้องการ: mutt -a $(mysqldump mysqldumpoptions) admin@example.org มันเป็นไปได้? ถ้าไม่ทำไม นี่อาจเป็นตัวอย่างที่โง่และแน่นอนมีวิธีที่ง่ายกว่าในการทำเช่นนี้ แต่ฉันหวังว่ามันจะอธิบายคำถามของฉันเกี่ยวกับการสร้างไฟล์เสมือนจากเอาต์พุตของคำสั่งอื่น
36 bash  redirection 

1
กู้คืนสคริปต์ที่รันจากเซสชันเทอร์มินัล
ดังนั้นฉันจึงใช้GNU Screenเพื่อจัดการสคริปต์ / โปรแกรมที่กำลังทำงานอยู่หลายรายการ มัลติเพล็กซ์และการถอดได้ค่อนข้างมีประโยชน์ ฉันลบสคริปต์ออกจากดิสก์และตอนนี้ฉันมีปัญหาในการค้นหาข้อมูลสำรอง อย่างไรก็ตามหนึ่งในเทอร์มินัลเซสชันกำลังดำเนินการสคริปต์ก่อนที่ไฟล์จะถูกลบและมันก็ยังทำงานได้ตามปกติ มีวิธีการแย่งชิงเทอร์มินัลเซสชันที่กำลังเรียกใช้สคริปต์เพื่อกู้คืนเนื้อหาของไฟล์นี้หรือไม่?

6
ผสาน 2 ไดเรกทอรีต้นไม้ใน Linux โดยไม่คัดลอก?
ฉันมีต้นไม้ไดเรกทอรีสองต้นที่มีเค้าโครงคล้ายกันเช่น . |-- dir1 | |-- a | | |-- file1.txt | | `-- file2.txt | |-- b | | `-- file3.txt | `-- c | `-- file4.txt `-- dir2 |-- a | |-- file5.txt | `-- file6.txt |-- b | |-- file7.txt | `-- file8.txt `-- c |-- file10.txt …
35 linux  bash  files 

6
Bash Loop - วิธีการหยุดลูปเมื่อฉันกด Control-C ภายในคำสั่ง?
ฉันกำลังซิงค์บางไดเรกทอรี ฉันเปิดเทอร์มินัล bash และกำลังใช้งานสิ่งนี้: for DIR in * ; do rsync -a $DIR example.com:somewhere/ ; done อย่างไรก็ตามถ้าฉันต้องการหยุดทุกสิ่งฉันกด Control-C นั่นหยุด rsync แต่จากนั้นมันจะไปต่อที่อื่น ในกรณีนี้ฉันรู้ว่าเกิดอะไรขึ้นและจากนั้นเพียงกด Control-C เหมือนคนบ้าจนทุกอย่างทำงานได้อีกครั้ง มีวิธีการ 'แก้ไข' นี้ไหม ฉันต้องการมันถ้าฉันมีวงแบบนั้นแล้วกด Control-C เพื่อที่มันจะกลับมาที่เปลือกทุบตีของฉัน

8
การใช้ปุ่มลูกศร ctrl กับ PuTTY และหน้าจอ
ฉันค้นหาและไม่สามารถหาวิธีแก้ปัญหานี้ได้ทุกที่ ฉันใช้ PuTTY จาก Windows เพื่อเชื่อมต่อกับเซิร์ฟเวอร์ต่าง ๆ ที่ฉันใช้ bash และหน้าจอ ดูเหมือนว่าทุบตีทำงานได้ดีกับปุ่ม Ctrl - ลูกศรเพื่อข้ามคำต่อคำในบรรทัดคำสั่ง แต่ภายในหน้าจอมันไม่ทำงาน ไม่ได้อยู่ในหน้าจอ ctrl-left ส่ง "^ [OC และ ctrl-right คือ" ^ [OD "ภายในหน้าจอฉันได้รับ" ^ [[C "และ" ^ [[D "] ซึ่งปรากฏเป็นรหัสสำหรับ ปุ่มลูกศรซ้าย / ขวามีวิธีใดบ้างที่จะรับหน้าจอให้จดจำปุ่ม ctrl-arrow เมื่อใช้ PuTTY (FYI ฉันจำไม่ได้ว่ามีปัญหานี้เมื่อใช้ gnu-terminal ใน linux แทนที่จะเป็น PuTTY) UPDATE: ดูเหมือนว่า PuTTY เป็นปัญหาเนื่องจากไม่ได้ส่งรหัสหลบหนีที่จำเป็นสำหรับการทำงาน …
33 bash  gnu-screen  putty 

6
หลีกเลี่ยงการสั่งการในประวัติศาสตร์
ฉันใช้ bash และฉันต้องการหลีกเลี่ยงคำสั่งบางอย่างที่ถูกเก็บไว้ในประวัติศาสตร์ เป็นไปได้ไหมที่จะทำเช่นนั้นสำหรับคำสั่งถัดไปเท่านั้น? เป็นไปได้ไหมที่จะทำเช่นนั้นตลอดทั้งเซสชัน?

8
มีเหตุผลที่จะใช้ทุบตีมากกว่า zsh หรือไม่ [ปิด]
ฉันอยากรู้ว่าทำไมคนเราถึงต้องการใช้ bash แทน zsh ฉันหมายถึง zsh เต็มที่เข้ากันได้กับ bash อย่าเข้าใจฉันผิด: ฉันไม่ชอบทุบตีหรืออะไรก็ตาม ฉันแค่อยากรู้ว่ามีประโยชน์ในการใช้มันมากกว่า zsh หรือไม่ ดังนั้นมีเหตุผลอะไรที่จะใช้ทุบตีมากกว่า zsh?
33 bash  scripting  shell  zsh 

2
Bash: รันไฟล์เรียกทำงานที่ให้สถานะการออกดี
ฉันต้องการเรียกใช้โปรแกรมปฏิบัติการใน Linux และไม่ว่าสถานะการออกจะกลับมาหรือไม่ก็ตามฉันต้องการส่งคืนสถานะการออกที่ดี (เช่นไม่มีข้อผิดพลาด) (นี่เป็นเพราะฉันใช้sh -exและฉันต้องการให้สคริปต์ทำงานต่อไปแม้ว่าคำสั่ง (เฉพาะ) จะล้มเหลว)
32 linux  bash 

2
ulimit -n และ / proc / sys / fs / file-max แตกต่างกันอย่างไร
ฉันสังเกตเห็นว่าในภาพ CentOS ใหม่ที่ฉันเพิ่งบูทขึ้นจาก EC2 ว่าค่าเริ่มต้น ulimit คือ 1024 เปิดไฟล์ แต่ / proc / sys / fs / file-max ตั้งไว้ที่ 761,408 และฉันสงสัยว่าทั้งสองขีด จำกัด ทำงานอย่างไร ด้วยกัน. ฉันคาดเดา ulimit -n จำกัด จำนวนตัวอธิบายไฟล์ต่อผู้ใช้ในขณะที่ / proc / sys / fs / file-max เป็นระบบกว้างหรือไม่ หากเป็นเช่นนั้นสมมติว่าฉันได้เข้าสู่ระบบเป็นสองเท่าของผู้ใช้เดียวกัน - ผู้ใช้ที่เข้าสู่ระบบแต่ละคนมีขีด จำกัด 1024 ของจำนวนไฟล์ที่เปิดหรือว่าเป็นข้อ จำกัด ของ 1024 ไฟล์ที่เปิดรวมระหว่างแต่ละไฟล์ ในผู้ใช้? และมีผลกระทบต่อประสิทธิภาพการตั้งค่าตัวอธิบายไฟล์สูงสุดของคุณเป็นจำนวนที่สูงมากหากระบบของคุณไม่เคยเปิดไฟล์จำนวนมาก?
32 linux  bash  kernel  ulimit 

3
รับการแจ้งเตือนเมื่อเซอร์วิสที่มอนิเตอร์ systemd เข้าสู่สถานะล้มเหลว
ฉันต้องมีข้อความเครือข่ายที่ส่งเมื่อบริการ systemd ที่ฉันมีปัญหาหรือหยุดทำงาน (กล่าวคือเข้าสู่สถานะที่ล้มเหลวฉันตรวจสอบสถานะการพักโดยใช้ WatchdogSec =) ฉันสังเกตเห็นว่า systemd ที่ใหม่กว่านั้นมี FailureAction = แต่ก็เห็นว่าสิ่งนี้ไม่อนุญาตคำสั่งโดยพลการ แต่เพิ่งรีบูต / ปิดเครื่อง โดยเฉพาะฉันต้องการวิธีที่จะส่งข้อความเครือข่ายหนึ่งข้อความเมื่อ systemd ตรวจพบว่าโปรแกรมขัดข้องและอีกข้อความหนึ่งเมื่อตรวจพบว่าข้อความหยุดทำงาน ฉันหวังว่าจะได้คำตอบที่ดีกว่า "การแยกวิเคราะห์บันทึก" และฉันต้องการบางสิ่งที่มีเวลาตอบสนองใกล้ - ทันทีดังนั้นฉันจึงไม่คิดว่าวิธีการลงคะแนนเป็นสิ่งที่ดี มันควรเป็นสิ่งที่ถูกกระตุ้นโดยเหตุการณ์ที่เกิดขึ้น
32 linux  bash  service  systemd 

3
ทำ cat / dev / urandom - Broken terminal
ด้วยความอยากรู้เมื่อชุดตัวละครของคุณแตกออกจากการทำอะไรคล้าย ๆcat /dev/urandomจะมีวิธีในการแก้ไขปัญหาดังกล่าวหรือไม่?
31 linux  bash  shell  tty  dev 


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