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

คำถามเฉพาะของ Bourne อีกครั้งของเชลล์ใน GNU เมื่อเทียบกับเชลล์ Bourne / POSIX อื่น ๆ สำหรับคำถามเกี่ยวกับเชลล์ Unix โดยทั่วไปให้ใช้ / เชลล์แท็กแทน

2
จะระบุการเติมข้อความอัตโนมัติที่กำหนดเองสำหรับคำสั่งเฉพาะได้อย่างไร
มีวิธีทุบตีรู้ว่าสิ่งที่จะแสดงเมื่อคุณสองแท็บ? ตัวอย่างเช่นฉันมีสคริปต์หลามscpyซึ่งต้องใช้อาร์กิวเมนต์คู่ ตัวอย่างเช่นapt-getถ้าคุณสองแท็บให้คุณ autoclean build-dep clean dselect-upgrade purge การอัพเกรดซอร์ส autoremove check dist-upgrade install ลบการอัพเดท มีวิธีทำเช่นนั้นสำหรับสคริปต์ / โปรแกรมของคุณเองหรือไม่? ฉันจำเป็นต้องรวมสคริปต์ python ของฉันไว้ในสคริปต์ทุบตีหรือไม่?

2
วิธีการจับภาพสั่ง STDOUT / STDERR และเพิ่มการประทับเวลา / คำนำหน้า?
ฉันได้สำรวจคำถามที่คล้ายกันเกือบทั้งหมดที่ มีอยู่ แล้วเพื่อประโยชน์ ให้ฉันอธิบายปัญหาโดยละเอียด: ฉันรันสคริปต์ที่ไม่ต้องใส่ข้อมูลบางส่วนและสิ่งเหล่านี้สามารถสร้างเอาต์พุตมาตรฐานและบรรทัดข้อผิดพลาดมาตรฐานได้ฉันต้องการจับภาพพวกเขาตามลำดับที่ถูกต้องตามที่แสดงโดยเทอร์มินัลอีมูเลเตอร์แล้วเพิ่มคำนำหน้าเช่น "STDERR:" และ "STDOUT:" ฉันได้ลองใช้ไพพ์และแม้กระทั่งวิธีที่อิงจากพวกมันเพื่อประโยชน์แล้ว ฉันคิดว่าวิธีการแก้ปัญหาคือการใช้ pty แม้ว่าฉันจะไม่มีความเชี่ยวชาญในเรื่องนั้น ฉันได้แอบมองเข้าไปในซอร์สโค้ดของVTE ของ Gnomeแต่ก็ไม่ได้มีประโยชน์อะไรมาก เป็นการดีที่ฉันจะใช้Goแทน Bash เพื่อทำสิ่งนี้ แต่ฉันไม่สามารถทำได้ ดูเหมือนว่าท่อโดยอัตโนมัติห้ามการสั่งซื้อบรรทัดที่ถูกต้องเพราะบัฟเฟอร์ มีใครบางคนที่สามารถทำสิ่งที่คล้ายกันได้หรือไม่? หรือเป็นไปไม่ได้เลยเหรอ? ฉันคิดว่าถ้าเทอร์มินัลอีมูเลเตอร์สามารถทำได้มันอาจไม่ใช่ - โดยการสร้างโปรแกรม C ขนาดเล็กที่จัดการ PTY แตกต่างกันหรือไม่ นึกคิดฉันจะใช้อินพุตแบบอะซิงโครนัสเพื่ออ่านสตรีม 2 รายการ (STDOUT และ STDERR) จากนั้นพิมพ์อีกครั้งตามความต้องการของฉัน แต่ลำดับของอินพุตเป็นสิ่งสำคัญ! หมายเหตุ:ฉันทราบถึงstderredแต่มันไม่ได้ผลสำหรับฉันกับสคริปต์ Bash และไม่สามารถแก้ไขเพื่อเพิ่มคำนำหน้าได้อย่างง่ายดาย (เนื่องจากโดยทั่วไปแล้วจะมี syscalls มากมาย) อัปเดต:เพิ่มด้านล่างสองส่วน ตัวอย่างโปรแกรมที่สร้าง stdout ผสม / stderr ผลลัพธ์ที่คาดหวังจากโปรแกรมด้านบน …

2
ความแตกต่างระหว่างตัวดำเนินการ >> และ> \>?
RHEL 6 มีความแตกต่างระหว่าง>>และ>\>ผู้ประกอบการหรือไม่ ฉันอ่านข้อความต่อไปนี้ในหนังสือการฝึกอบรม RHEL: คุณสามารถเพิ่มเอาต์พุตมาตรฐานไปยังจุดสิ้นสุดไฟล์ที่มีอยู่ด้วยลูกศรเปลี่ยนเส้นทางสองครั้งพร้อมกับคำสั่งเช่น ls >\> filelist ฉันคุ้นเคยกับ>>โอเปอเรเตอร์มากกว่าและเมื่อฉันลองทั้งคู่ฉันจะได้ผลลัพธ์ที่แตกต่างกัน การใช้>>ดูเหมือนจะผนวกเอาต์พุตไปยังไฟล์ที่ตามมา (ตามที่คาดไว้) การใช้>\>ดูเหมือนจะผนวกเอาต์พุตไปยังไฟล์ที่ชื่อแท้จริง> นี่เป็นข้อผิดพลาดในหนังสือที่ฉันอ่านหรือไม่? หรือฉันพลาดจุดของผู้เขียน
25 bash  rhel 

2
Negate ในขณะที่เงื่อนไขวนในทุบตี
ในส่วนของสคริปต์ที่ฉันใช้งานอยู่ฉันต้องการตรวจสอบว่าที่อยู่ IP ที่ป้อนเข้านั้นอยู่ในรูปแบบที่ถูกต้อง ฉันต้องการวนรอบในขณะที่รูปแบบอินพุตไม่ถูกต้อง ข้อมูลต่อไปนี้ใช้สำหรับการวนซ้ำในขณะที่การจัดรูปแบบถูกต้อง while [[ $range =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} ]] do ฉันจะหมุนสิ่งนี้เพื่อบอกว่าไม่เหมาะกับรูปแบบ ฉันหวังว่า!=~จะได้ผล แต่ฉันได้รับข้อผิดพลาดทางไวยากรณ์
25 bash 


3
ฉันจะตรวจสอบได้อย่างไรว่าฉันอยู่ในชั้นย่อย
ฉันพยายามเขียนฟังก์ชั่นเพื่อแทนที่ฟังก์ชั่นการทำงานของexitbuiltin เพื่อป้องกันตัวเองไม่ให้ออกจากเครื่อง ฉันพยายามใช้SHLVLตัวแปรสภาพแวดล้อม แต่ดูเหมือนจะไม่เปลี่ยนแปลงภายใน subshells: $ echo $SHLVL 1 $ ( echo $SHLVL ) 1 $ bash -c 'echo $SHLVL' 2 ฟังก์ชั่นของฉันเป็นดังนี้: exit () { if [[ $SHLVL -eq 1 ]]; then printf '%s\n' "Nice try!" >&2 else command exit fi } สิ่งนี้จะไม่อนุญาตให้ฉันใช้exitภายใน subshells แม้ว่า: $ exit Nice try! $ …
24 bash  shell  exit  subshell 

3
เนื้อหาของ / bin / bash คืออะไรและฉันต้องทำอย่างไรหากฉันเขียนทับมันโดยไม่ตั้งใจ
ฉันเขียนทับไฟล์ / bin / bash โดยไม่ตั้งใจด้วยสคริปต์ใบ้ที่ฉันตั้งใจจะใส่ไว้ในโฟลเดอร์ / bin ฉันจะรับเนื้อหาของไฟล์นั้นกลับมาได้อย่างไร มีวิธีที่ฉันสามารถค้นหาเนื้อหาบนเว็บและเพียงแค่คัดลอกพวกเขากลับมา? ตัวเลือกของฉันคืออะไรที่นี่เนื่องจากเทอร์มินัลนั้นมีข้อผิดพลาดในการพูดถึง ฉันยังคงเป็นผู้เล่นหน้าใหม่ของสิ่งนี้และฉันขอขอบคุณทุกความช่วยเหลือที่ฉันสามารถได้รับ แก้ไข: ฉันลืมที่จะพูดถึงฉันใน Kali 2.2 Rolling ซึ่งค่อนข้างเดเบียนด้วยคุณสมบัติเพิ่มเติมบางอย่าง แก้ไข 2: ฉันยังรีสตาร์ทเครื่องเนื่องจากฉันไม่ได้ตระหนักถึงความผิดพลาดของฉันจนกระทั่งสองสามวันที่ผ่านมา นั่นทำให้ยากขึ้นอีกหน่อย

4
ฉันจะแทนที่ AND (&&) ในวง for ได้อย่างไร
ฉันต้องการหาสิ่งที่เทียบเท่า cmd 1 && cmd 2 && ... && cmd 20 แต่มีคำสั่งแสดงอยู่ภายในforลูปเช่น for i in {1..20} do cmd $i done คุณอยากแนะนำอะไรให้เปลี่ยนในนิพจน์ที่สองเพื่อหาค่าที่เท่ากัน

5
วิธีรับ tty ที่ bash ทำงานอยู่?
ในวิธีที่สองที่เสนอโดยหน้านี้วิธีหนึ่งได้รับ tty ซึ่ง bash กำลังถูกรันด้วยคำสั่ง: ps ax | grep $$ | awk '{ print $2 }' ฉันคิดกับตัวเองว่านี่เป็นสิ่งที่ขี้เกียจนิดหน่อยโดยแสดงรายการกระบวนการทำงานทั้งหมดเพื่อดึงข้อมูลหนึ่ง มันจะไม่มีประสิทธิภาพมากกว่านี้หรือไม่ ps -p $$ | tail -n 1 | awk '{ print $2 }' FYI ฉันเจอปัญหานี้เพราะบางครั้งคำสั่งแรกจะให้ผลลัพธ์สองบรรทัด (หรือมากกว่า) สิ่งนี้จะเกิดขึ้นแบบสุ่มเมื่อจะมีกระบวนการอื่นทำงานด้วย PID ที่มี$$เป็นสตริงย่อย ในแนวทางที่สองฉันกำลังหลีกเลี่ยงกรณีดังกล่าวโดยขอ PID ที่ฉันรู้ว่าฉันต้องการ
24 bash  tty  ps 

5
Bash คำสั่งเพื่อคัดลอกก่อนเคอร์เซอร์และวางหลังจาก?
ฉันไม่แน่ใจว่าจะใช้คำนี้ได้อย่างไร แต่บ่อยครั้งที่ฉันพบว่าฉันพิมพ์คำสั่งเช่นนี้: cp /etc/prog/dir1/myconfig.yml /etc/prog/dir1/myconfig.yml.bak ฉันมักจะพิมพ์เส้นทางสองครั้ง (ด้วยแท็บเสร็จ) หรือฉันจะคัดลอกและวางเส้นทางด้วยเคอร์เซอร์ มี bashfoo ที่ทำให้พิมพ์ง่ายขึ้นไหม

1
เหตุใดอักขระตัวแทนที่ไม่มีเครื่องหมายในการทำงานระยะไกลจึงใช้ scp
ฉันพิมพ์สิ่งนี้ใน Bash: scp user@remote:~/dir/*.xml . และใช้งานได้รับไฟล์ทั้งหมดที่สร้างไวด์การ์ดบนเซิร์ฟเวอร์ระยะไกล แต่ทำไมถึงใช้งานได้? scpผมคิดว่าทุบตีขยายนิพจน์ตัวแทนในการขัดแย้งก่อนที่จะกลายเป็นข้อโต้แย้งที่มองเห็นเครื่องมือเช่น
24 bash  shell  wildcards 

1
เครื่องมือบรรทัดคำสั่งมีรายการเติมข้อความอัตโนมัติของตัวเองได้อย่างไร
Bash ใน Ubuntu รู้ได้อย่างไรว่ารายการการกระทำเฉพาะของเครื่องมือ? ตัวอย่างเช่นถ้าฉันพิมพ์apt-getและแท็บสองครั้งฉันจะเห็นเพียงลบอัปเดตอัปเกรด ... ฯลฯ แต่ไม่ใช่การดำเนินการสำหรับคำสั่งอื่นหรือไฟล์ในไดเรกทอรีปัจจุบัน ฉันกำลังพัฒนาเครื่องมือบรรทัดคำสั่งใน Go และต้องการให้ฟีเจอร์นี้สำหรับ distros ที่รองรับ

4
วิธีกำหนดความสมบูรณ์ของคำสั่ง Bash เอง?
ในทุบตีมันง่ายพอที่จะตั้งค่าเสร็จสิ้นการอาร์กิวเมนต์คำสั่งที่กำหนดเองโดยใช้ในcompleteตัว ตัวอย่างเช่นหากคำสั่งสมมุติที่มีบทสรุปของfoo --a | --b | --cคุณสามารถทำได้complete -W '--a --b --c' foo นอกจากนี้คุณยังสามารถปรับแต่งเสร็จสิ้นการที่คุณได้รับเมื่อคุณกดTabที่ว่างเปล่าพร้อมรับคำใช้เช่นcomplete -E complete -E -W 'foo bar'จากนั้นกดแท็บที่พร้อมท์ที่ว่างเปล่าจะแนะนำเท่านั้นและfoobar ฉันจะกำหนดความสมบูรณ์ของคำสั่งเองได้ที่พรอมต์ที่ไม่ใช่ข้อยกเว้น เช่นถ้าฉันนั่งที่: anthony@Zia:~$ f วิธีทำเสร็จสิ้นการปรับแต่งเพื่อให้กดแท็บจะเสมอที่สมบูรณ์เพื่อfoo? (กรณีจริงที่ฉันต้องการคือlocTAB→ localcและพี่ชายของฉันซึ่งขอให้ฉันถามสิ่งนี้ต้องการด้วย mplayer)

4
เริ่มต้นด้วย bash: -lt และ -gt อาร์กิวเมนต์
ฉันเริ่มต้นด้วยทุบตีและฉันพบต่อไปนี้: if test $first -lt $second then echo $first is lower than $second else if test $first -gt $second then echo $first is higher than $second else echo $first and $second are equals fi fi สำหรับการอ่านสคริปต์และดำเนินการฉันรู้ว่ามันทำอะไร แต่ไม่ใช่สิ่งที่ -lt และ -gt ใครสามารถบอกฉันได้ว่าชื่อ 'เครื่องมือ' ประเภทนั้นคืออะไรและพวกเขา (-lt และ -gt) ทำอะไร ขอบคุณ!
24 bash  shell  test 

8
วิธีการตรวจสอบสภาพแวดล้อมเดสก์ทอปในสคริปต์ทุบตี?
ฉันกำลังเขียนbashสคริปต์ที่ต้องรู้สภาพแวดล้อมเดสก์ท็อป (XFCE, Unity, KDE, LXDE, Mate, Cinnamon, GNOME2, GNOME3, ... ) กำลังทำงานอยู่ ฉันจะรับข้อมูลนั้นได้อย่างไร

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