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

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

1
การโยงคีย์แบบกำหนดเองสำหรับโหมดเชลล์ vi คือ“ set -o vi”?
ฉันเพิ่งค้นพบสิ่งมหัศจรรย์ของset -o viและอยากรู้อยากเห็นถ้ามันเป็นไปได้ที่จะปรับแต่งโหมดเปลือก vi นี้ในบางวิธีเดียวกันกับที่คุณสามารถปรับแต่ง vi หรือ vim? ยกตัวอย่างเช่นการสร้างคีย์ที่กำหนดเองผูกพันกับแผนที่คีย์สะดวกมากขึ้นหรือคำสั่งผสมที่สำคัญในการesc? หากไม่รองรับในปัจจุบันมันจะยากแค่ไหนในการปรับเปลี่ยนซอร์สโค้ดของโปรแกรมและฮาร์ดโค้ดในการปรับแต่งบางอย่างหรือว่าเป็นแนวคิดที่ไม่ดี
18 bash  vi 

1
“ มนุษย์” คืนค่าหน้าจอเมื่อฉันออกจากโปรแกรมอย่างไร
ถ้าผมเปิดหน้าคนของโปรแกรมเหมือนcatหรือlsจะพิมพ์ (ไม่อาจจะเป็นคำที่เหมาะสม) เนื้อหาของหน้าคนและเมื่อผมกดqมันแสดงให้เห็นหน้าจอเช่นเดียวกับก่อนที่จะกล่าวอ้างmanคำสั่ง การคืนค่าเกิดขึ้นได้อย่างไร อะไรที่ลบทุกอย่างแล้วพิมพ์เนื้อหาก่อนหน้าของเชลล์? ตัวอย่าง: [VAR121@Tesla Testing]$ man ls เอาท์พุท: LS(1) User Commands LS(1) NAME ls - list directory contents SYNOPSIS ls [OPTION]... [FILE]... ............ เมื่อฉันกดqหน้าจอจะกลับไปที่ลักษณะที่ปรากฏเริ่มต้นของเชลล์เช่นพรอมต์ที่แสดงด้านล่าง [VAR121@Tesla Testing]$ man ls [VAR121@Tesla Testing]$ หน้าจอจะคืนค่าอย่างไร
18 bash  shell  terminal  man 

3
วิธีเลื่อนการขยายตัวแปร
ฉันต้องการเริ่มต้นสตริงที่ด้านบนสุดของสคริปต์ด้วยตัวแปรที่ยังไม่ได้ตั้งค่าเช่น: str1='I went to ${PLACE} and saw ${EVENT}' str2='If you do ${ACTION} you will ${RESULT}' และจากนั้นในภายหลังPLACE, EVENT, ACTIONและRESULTจะเป็นชุด ฉันต้องการที่จะสามารถพิมพ์สตริงของฉันออกมาพร้อมกับตัวแปรที่ขยาย ตัวเลือกเดียวของฉันคือevalอะไร? ดูเหมือนว่าจะใช้งานได้: eval "echo ${str1}" มาตรฐานนี้หรือไม่ มีวิธีที่ดีกว่าในการทำเช่นนี้? มันจะดีถ้าไม่ทำงานevalเพราะตัวแปรอาจเป็นอะไรก็ได้
18 bash  shell  string 

5
วิธีการตั้งค่านามแฝงในแต่ละไดเรกทอรี?
สมมติว่าคุณมีนามแฝงgoแต่ต้องการให้ทำสิ่งต่าง ๆ ในไดเรกทอรีที่ต่างกันหรือไม่ ในไดเรกทอรีหนึ่งควรรันcmd1แต่ในอีกไดเรกทอรีหนึ่งควรรันcmd2 อย่างไรก็ตามฉันมีชื่อแทนสำหรับการเปลี่ยนไปยังไดเรกทอรีด้านบนแล้วดังนั้นจึงเป็นไปได้ที่จะผนวกการgoมอบหมายนามแฝงเข้ากับfooนามแฝง alias "foo=cd /path/to/foo" ทำงานใน bash (?) บน OSX

5
ฉันจะดำเนินการกับไฟล์ทั้งหมดที่มีนามสกุลเฉพาะในโฟลเดอร์ย่อยอย่างสง่างามได้อย่างไร?
ทางออกที่ดีที่สุดของฉันในปัจจุบันคือ: for i in $(find . -name *.jpg); do echo $i; done ปัญหา: ไม่จัดการช่องว่างในชื่อไฟล์ หมายเหตุ: ฉันจะรักวิธีการทำเช่นนี้กราฟิกเช่นคำสั่ง "ต้นไม้"
18 bash  shell  find 

5
รวมสองรายการในขณะที่ลบรายการที่ซ้ำกัน
ฉันมีระบบลินุกซ์ในตัวโดยใช้ Busybox (OpenWRT) - ดังนั้นคำสั่งจะถูก จำกัด ฉันมีสองไฟล์ที่มีลักษณะดังนี้: ไฟล์แรก aaaaaa bbbbbb cccccc mmmmmm nnnnnn ไฟล์ที่สอง mmmmmm nnnnnn yyyyyy zzzzzz ฉันต้องการรวม 2 รายการเหล่านี้เป็น 1 ไฟล์และลบรายการที่ซ้ำกัน ผมไม่ได้มีความแตกต่าง (พื้นที่ จำกัด ) เราจึงได้รับการใช้งานที่ดีawk, sedและgrep(หรือเครื่องมืออื่น ๆ ที่อาจจะรวมอยู่ในอินสแตนซ์ Busybox มาตรฐาน) ไปที่ไฟล์ผสานเช่น: command1 > mylist.merge command2 mylist.merge > originallist ไม่เป็นไร มันไม่จำเป็นต้องเป็นคำสั่งบรรทัดเดียว ฟังก์ชั่นที่กำหนดไว้ในปัจจุบันในกรณีของ Busybox ที่ฉันใช้ (ค่าเริ่มต้น OpenWRT): [, [, …
18 bash  grep  sed  awk  busybox 

5
การใช้ข้อมูลที่อ่านจากไพพ์แทนที่จะเป็นไฟล์ในตัวเลือกคำสั่ง
ตามนิยามของมนุษย์คำสั่งนี้รับอินพุตจากไฟล์ $ command -r FILENAME สมมติว่าเป็นไฟล์ที่มีรายชื่อของชื่อไฟล์เป็นมันถูกสร้างขึ้นโดยใช้FILENAMEls > FILENAME ฉันจะป้อนคำสั่งด้วยผลลัพธ์lsโดยตรงได้อย่างไร ในหัวของฉันบางสิ่งเช่นนี้น่าจะเป็นไปได้: $ ls | command -r แต่ไม่เช่นนั้นผลลัพธ์ของการlsไม่ได้รับการเชื่อมต่อเป็นอาร์กิวเมนต์ เอาท์พุท: Usage: command -r FILENAME error: -r option requires an argument ฉันจะได้รับผลที่ต้องการได้อย่างไร
18 bash  pipe 

4
ฉันจะแยกกระบวนการออกจากสคริปต์ทุบตีได้อย่างไร
ฉันกำลังพยายามแยกโพรเซสจาก bash script เพื่อที่ SIGINT จะไม่ถูกส่งต่อไปยังโพรเซสเมื่อฉันออกจากสคริปท์ ฉันใช้disownคำสั่งในเทอร์มินัลโดยตรงอย่างไรก็ตามใน bash disownไม่ได้หยุด SIGINT จากการถูกส่งต่อ วัตถุประสงค์ของสคริปต์นี้คือการเริ่มต้น openocd แล้ว gdb ด้วยการเรียกเพียงครั้งเดียว เนื่องจากสคริปต์ไม่เคยออก (กำลังเรียกใช้ gdb) SIGINT ยังคงถูกส่งต่อจาก gdb ไปยัง openocd ซึ่งเป็นปัญหาเนื่องจาก SIGINT ใช้เป็นคำสั่ง halt ใน gdb ในเทอร์มินัลมันจะมีหน้าตาดังนี้: $ openocd & # run openocd demonized $ disown $! # disown last pid $ gdb # invoke GDB …
18 bash  disown 


5
วิธีแปลงไฟล์ pdf เป็นสีขาว - ดำ
ฉันต้องการแปลงไฟล์ PDF ที่มีข้อความสีและรูปภาพในไฟล์ PDF อื่นที่มีเฉพาะขาวดำเพื่อลดขนาดของมัน นอกจากนี้ฉันต้องการเก็บข้อความเป็นข้อความโดยไม่ต้องเปลี่ยนองค์ประกอบของหน้าในรูปภาพ ฉันลองคำสั่งต่อไปนี้: convert -density 150 -threshold 50% input.pdf output.pdf พบในคำถามอื่นลิงก์แต่ทำในสิ่งที่ฉันไม่ต้องการ: ข้อความในเอาต์พุตถูกแปลงในรูปภาพที่ไม่ดีและไม่สามารถเลือกได้อีกต่อไป ฉันลอง Ghostscript แล้ว: gs -sOutputFile=output.pdf \ -q -dNOPAUSE -dBATCH -dSAFER \ -sDEVICE=pdfwrite \ -dCompatibilityLevel=1.3 \ -dPDFSETTINGS=/screen \ -dEmbedAllFonts=true \ -dSubsetFonts=true \ -sColorConversionStrategy=/Mono \ -sColorConversionStrategyForImages=/Mono \ -sProcessColorModel=/DeviceGray \ $1 แต่มันทำให้ฉันข้อความผิดพลาดต่อไปนี้: ./script.sh: 19: ./script.sh: output.pdf: not …

3
ความแตกต่างระหว่าง env, setenv, export และเวลาที่จะใช้คืออะไร?
เมื่อเร็ว ๆ นี้ฉันสังเกตเห็นว่าเรามี 3 ตัวเลือกในการตั้งค่าตัวแปรสภาพแวดล้อม: export envVar1=1 setenv envVar2=2 env envVAr3=3 หากมีวิธีอื่นโปรดบอกเรา เมื่อใดที่ฉันควรเลือกหนึ่งรายการมากกว่ารายการอื่น กรุณาแนะนำแนวทาง ในเรื่องของความเข้ากันได้ของเชลล์ซึ่งครอบคลุมมากที่สุด (ครอบคลุมภาษาของเชลล์มากกว่า) ฉันสังเกตเห็นคำตอบนี้แล้วแต่ฉันต้องการขยายคำถามด้วยenvและแนวทางการตั้งค่าการใช้งาน

2
วิธีการตั้งค่า PATH เมื่อรันคำสั่ง ssh?
สมมติว่าผู้ใช้มีเปลือกใน/bin/bash /etc/passwdจากนั้นssh user@host commandรันคำสั่งโดยใช้ Bash แต่เปลือกที่ไม่เข้าสู่ระบบหรือโต้ตอบซึ่งหมายถึงค่า~/.bash_profileมิได้~/.bashrcมีที่มา ในกรณีนั้นจะตั้งค่าPATHตัวแปรสภาพแวดล้อมอย่างไรเพื่อให้สามารถค้นหาและเรียกใช้งานโปรแกรมได้? จะแนะนำให้นำหน้าคำสั่งจริงด้วยsource ~/.bashrcหรือไม่
18 bash  ssh 

5
หลีกเลี่ยงการเรียกใช้สคริปต์หากไม่ได้กำหนดตัวแปร
ฉันมีสคริปต์ดูเหมือนว่า: c=0 for f in */*; do cp -v "$f" "/myhome/CE$(printf '%0*d' 2 $BATCHNUM)-new-stuctures_extracted/test-$(printf '%0*d' 5 $c)" c=$((c=c+1)) done อย่างไรก็ตามผู้ใช้ต้องจัดให้มีการเรียกตัวแปร BATCHNUM และฉันต้องบังคับให้สคริปต์นี้หยุดทำงาน จะดีกว่าถ้าฉันบังคับให้สคริปต์ที่เรียกสคริปต์นี้หยุดทำงานด้วย (หรือแม้แต่ # 1 สคริปต์ที่เรียกใช้สคริปต์ # 2 ซึ่งเรียกสคริปต์นี้)

4
วิธีแสดงชื่อโฮสต์ในพรอมต์ commandline Linux
ฉันมีหลาย VM และตอนนี้ฉันพร้อมรับคำสั่งบรรทัดคำสั่งดูเหมือน-bash-3.2$; เหมือนกันทุก VM เพราะไม่มีชื่อโฮสต์ ฉันต้องดูว่าฉันใช้ VM ชนิดใดอยู่hostnameก่อนที่จะทำการดำเนินการใด ๆ ฉันจะเพิ่มชื่อโฮสต์ในเชลล์พรอมต์ได้อย่างไร ENV: CentOS / ssh
18 bash  prompt  hostname 

3
ทุบตี globstar การจับคู่
ฉันมีโครงสร้างไดเรกทอรีนี้: ~/tmp/globstar ɀ find dir -type f dir/file.ext dir/subdir1/file.ext dir/subdir2/file.ext และด้วยglobstarตัวเลือกที่เปิดใช้งานใน Bash ฉันสามารถพูดได้: ~/tmp/globstar ɀ ls -1 dir/**/*.ext dir/subdir1/file.ext dir/subdir2/file.ext คำถามของฉันคือ: ทำไมถูกdir/file.extแยกออกจากรายการนี้? คู่มือทุบตีพูดถึงสิ่งนี้เกี่ยวกับglobstar: หากตั้งค่ารูปแบบ '**' ที่ใช้ในบริบทการขยายชื่อไฟล์จะจับคู่ไฟล์ทั้งหมดและไม่มีค่าไดเรกทอรีและไดเรกทอรีย่อยหรือมากกว่า หากรูปแบบนั้นตามด้วย '/' จะมีเพียงไดเรกทอรีและไดเรกทอรีย่อยเท่านั้นที่ตรงกัน “ ศูนย์ ” ในวรรคนี้ให้ฉันด้วยความประทับใจที่dir/file.extควรจะรวม; ถ้าฉันหวังว่าจะหายไปบางสิ่งบางอย่าง
18 bash  wildcards 

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