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

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

1
การใช้วงเล็บปีกกา {} เป็นอาร์กิวเมนต์ของคำสั่งและตัวเลือกต่างๆ
ตัวอย่าง ฉันเพิ่งพบตัวอย่างของการใช้วงเล็บปีกกาคู่{}โดยไม่มีอะไรในระหว่างวงเล็บเปิดและปิดเป็นอาร์กิวเมนต์ของคำสั่งและแม้แต่กับตัวเลือก: cat foo | xargs -I{} echo {} find . -size 0 -exec rm -i {} \; ไม่มีเอกสารประกอบ ปัญหาของฉันคือฉันไม่สามารถหาเอกสารในGNU Bash Manualที่อธิบายการใช้งาน{}ในบริบทเช่นในตัวอย่างข้างต้น ผมไม่คิดว่ามันเป็นขยายตัวพารามิเตอร์${}เพราะเครื่องหมายดอลลาร์ต้องนำหน้าวงเล็บปิดล้อมในการขยายตัวพารามิเตอร์ในขณะที่ มันไม่สามารถเป็นส่วนขยายรั้งได้เช่นกันเพราะใช้รูปแบบของ{x..y[..incr]}ที่ไหนxและyไม่จำเป็น นอกจากนี้ยังไม่สามารถจัดกลุ่มคำสั่งได้เนื่องจาก{}ใช้เป็นอาร์กิวเมนต์ คำถาม วงเล็บปีกกาคู่คู่{}หมายถึงอะไรโดยทั่วไปในฐานะอาร์กิวเมนต์สำหรับคำสั่งใด ๆ ที่ยอมรับมัน ฉันจะหาเอกสารที่อธิบายการใช้งานของ{}อาร์กิวเมนต์ได้ที่ไหน
11 bash  shell 

2
เชลล์ posix: รายการพิมพ์ของชื่อตัวแปรสภาพแวดล้อม (ไม่มีค่า)
ในวิธีที่เข้ากันได้กับ posix ที่ทำงานกับการใช้งานหลายอย่างฉันจะพิมพ์รายการตัวแปรสภาพแวดล้อมที่กำหนดไว้ในปัจจุบันโดยไม่มีค่าได้อย่างไร ในการใช้งานบางอย่าง (mksh, freebsd / bin / sh) เพียงแค่ใช้exportด้วยตัวเองจะพอดีกับการเรียกเก็บเงิน: $ export FOO2 FOO แต่สำหรับการปรับใช้อื่น ๆ (bash, zsh, dash) exportก็แสดงค่าเช่นกัน ด้วย bash ตัวอย่างเช่น: $ export export FOO2='as df\ asdk=fja:\ asd=fa\ asdf' export FOO='sjfkasjfd kjasdf:\ asdkj=fkajdsf:\ :askjfkajsf=asdfkj:\ safdkj' $ printenv | sed -n l FOO2=as\tdf\$ asdk=fja:\$ asd=fa\$ asdf$ FOO=sjfkasjfd kjasdf:\$ …

3
Shell Script: การสร้างตัวแปรพร้อมตัวเลือกภายใน
ฉันมีคำสั่ง rsync พร้อมพารามิเตอร์ต่อไปนี้: rsync -avz --{partial,stats,delete,exclude=".*"} ฉันต้องการวางพารามิเตอร์นั้นไว้ในตัวแปรเพื่อนำมาใช้ใหม่ในสคริปต์ บางสิ่งเช่นนี้ #!/bin/bash VAR=rsync -avz --{partial,stats,delete,exclude=".*"} $VAR /dir1 /dir2 ฉันได้ลองด้วยคำพูดคำพูดเดี่ยววงเล็บไม่ประสบความสำเร็จ

2
วิธีการทำ ctrl + c / not / ขัดจังหวะ while-loop?
รับห่วงนี้: while sleep 10s ; do something-that-runs-forever done เมื่อฉันกด Ctrl + C ทั้งวงในขณะที่วงถูกขัดจังหวะ สิ่งที่ฉันต้องการจะทำคือการขัดจังหวะ "บางสิ่งบางอย่าง" - ประมวลผลให้ผ่านไป 10 วินาทีแล้วเริ่ม "บางอย่าง" ใหม่ ฉันจะทำให้ ctrl + c ส่งผลกระทบกับ "บางอย่าง" เท่านั้นและไม่ใช่ while-loop ได้อย่างไร แก้ไข: "ขัดจังหวะ" เช่นเดียวกับใน SIGINT ฆ่า. ยกเลิก ยุติ ไม่ "ขัดจังหวะ" ในขณะที่ "หยุด"
11 bash 

6
อ่านไฟล์ที่มุ่งเน้นบรรทัดซึ่งอาจไม่ลงท้ายด้วยการขึ้นบรรทัดใหม่
ฉันมีไฟล์ชื่อ/tmp/urlFileที่แต่ละบรรทัดแสดงถึง url ฉันพยายามอ่านจากไฟล์ดังต่อไปนี้: cat "/tmp/urlFile" | while read url do echo $url done หากบรรทัดสุดท้ายไม่ลงท้ายด้วยอักขระขึ้นบรรทัดใหม่บรรทัดนั้นจะไม่ถูกอ่าน ฉันสงสัยว่าทำไม เป็นไปได้ไหมที่จะอ่านทุกบรรทัดไม่ว่าจะจบลงด้วยการขึ้นบรรทัดใหม่หรือไม่?

1
zsh ไม่สามารถอินพุตไปยังเทอร์มินัลเมื่อวาง stdin และ stdout ด้วยคำสั่งตัวแปรที่มีเอาต์พุต tty
ข้อมูลระบบ: macOS Sierra 10.12.6 zsh 5.4.2 (x86_64-apple-darwin16.7.0) GNU bash, version 4.4.12(1)-release (x86_64-apple-darwin16.3.0) เลื่อนไปที่ตัวอย่างที่ด้านล่างหากคุณเพียงต้องการขุดตัวอย่างง่าย ๆ ที่ฉันทำ หมายเหตุ: ฉันไม่ใช่zshผู้ใช้ที่ยิ่งใหญ่ ฉันกำลังมองหาfzfปุ่มลัดสำหรับbashและzsh. $(__fzfcmd)แจ้งให้ทราบว่าพวกเขาทั้งสองเรียกใช้คำสั่งตัวแปร __fzfcmdโดยเอาต์พุตดีฟอลต์fzfไปยัง stdout และการแทนที่พารามิเตอร์เพิ่งรัน command ( fzf) ซึ่งเป็นผลมาจากเอาต์พุต หนึ่งความแตกต่างระหว่างbashและzshสคริปต์เป็นที่bashหนึ่งต่อท่อส่งออกของ$(__fzfcmd)แต่zshเพียงแค่จับมันไว้ภายในอาร์เรย์ ฉันเดาว่าเป็นเพราะปัญหาzshเมื่อคุณไปป์ไลน์เอาท์พุทของfzfที่คุณไม่สามารถป้อนข้อมูลfzfและกระบวนการไพพ์ไปยังโดยfzfไม่ได้รับ stdin ใด ๆ ทางเลือกเดียวของคุณคือการหรือ^Z ดูเหมือนจะเป็นพื้นหลังกระบวนการด้วยเหตุผลบางอย่าง หรือบางทีพวกเขาแค่ต้องการแถวลำดับเพื่อที่จะได้วิ่งต่อไป รุ่นไม่มายากลบางอย่างในกุญแจสำคัญที่มีผลผูกพันกับ^C^Czle vi-fetch-historybash"\e^": history-expand-line ตอนนี้fzfไม่สำคัญ ดูเหมือนว่าคุณเพียงแค่ต้องใช้โปรแกรมที่ให้ผลลัพธ์ที่ttyจะเรียกโดยการทดแทนพารามิเตอร์เพื่อทำให้เกิดปัญหานี้ ดังนั้นฉันจะแสดงตัวอย่างที่ง่ายขึ้น ต่อไปนี้เป็นคำสั่งอื่น ๆ ที่ให้ผลลัพธ์ttyซึ่งอาจทำให้เกิดปัญหานี้ได้zsh: vipe (เรียกใช้เครื่องมือแก้ไขกลางท่อ) 'vim -' (ทำให้เป็นกลุ่มอ่านจาก stdin คล้ายกับ …
11 bash  zsh  pipe  tty 

2
สคริปต์ Bash ไม่เห็น SIGHUP ใช่ไหม
ฉันมีสคริปต์ต่อไปนี้: #!/bin/bash echo "We are $$" trap "echo HUP" SIGHUP cat # wait indefinitely เมื่อฉันส่งSIGHUP(ใช้kill -HUP pid) ไม่มีอะไรเกิดขึ้น ถ้าฉันเปลี่ยนสคริปต์เล็กน้อย: #!/bin/bash echo "We are $$" trap "kill -- -$BASHPID" EXIT # add this trap "echo HUP" SIGHUP cat # wait indefinitely ... จากนั้นสคริปต์ก็ทำecho HUPสิ่งที่ถูกต้องทันทีที่ออก (เมื่อฉันกด Ctrl + C): roger@roger-pc:~ $ ./hupper.sh …
11 bash  signals 

3
$ HOME / bin dir ไม่ได้อยู่บน $ PATH
ในฉัน~/.profileฉันมีบล็อกสุดท้ายซึ่งควรโหลดส่วนบุคคลของฉันbin/ directoryเช่นนี้: # set PATH so it includes user's private bin if it exists if [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" fi แต่ดูเหมือนจะไม่โหลด: echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games ทำไมสิ่งนี้ถึงไม่ทำงาน (เปลือกของฉันคือทุบตี) แก้ไขสำหรับ Tigger echo $0 => bash echo $HOME => /home/student whoami => student less /etc/*-release => PRETTY_NAME="Debian GNU/Linux 9 (stretch)" NAME="Debian …

3
BASH และพฤติกรรมการคืนรถ
ฉันมีหนึ่งคำถามที่รวดเร็ว เป็นเรื่องปกติหรือไม่ที่ bash (ฉันใช้ 4.4.11) ไม่แสดงบรรทัด / ข้อความที่คั่น / จบด้วย plain \r? ฉันรู้สึกประหลาดใจเล็กน้อยที่เห็นพฤติกรรมนี้: $ a=$(printf "hello\ragain\rgeorge\r\n") $ echo "$a" george แต่ข้อความ "hello อีกครั้ง" ยังคงอยู่ที่นั่นอย่างใด "ซ่อน": $ echo "$a" |od -w32 -t x1c 0000000 68 65 6c 6c 6f 0d 61 67 61 69 6e 0d 67 65 6f 72 67 …

3
อะไรคือความแตกต่างระหว่าง `>> / dev / stderr` (ด้วยพื้นที่สีขาว) และ`> & 2`
ในทุบตี ฉันมีปัญหาในการพิจารณาสิ่งที่ฉันควรใช้? สคริปต์ของฉันทั้งหมดใช้ ">> / dev / stderr" ที่ bash prompt, ถ้าฉันลอง: echo test >>/dev/stderrwork echo test >> /dev/stderrwork echo test >/dev/stderrworks echo test > /dev/stderrworks echo test >>&2ล้มเหลว! echo test >> &2ล้มเหลว! echo test >&2ทำงาน echo test > &2ล้มเหลว! ฉันยินดีที่จะเปลี่ยนสคริปต์>&2ทั้งหมดเป็น ดูเหมือนว่าจะมีผลกระทบอย่างมากกับ ssh (หลังจากsu SomeUser) ที่>>/dev/stderrจะไม่ทำงานเลย (ปฏิเสธสิทธิ์) เพียง>&2จะทำงาน

3
จำประวัติทุบตี "ท้องถิ่น" ในโฟลเดอร์หรือไม่?
ฉันมีสคริปต์ในโฟลเดอร์ที่ฉันใช้กับอาร์กิวเมนต์ที่มีความยาว มีโอกาสใดบ้างที่ฉันสามารถมีประวัติของคำสั่งที่ดำเนินการในไดเรกทอรีนั้นแทนการย้อนกลับไปดูประวัติทั้งหมด?

4
เป็นไปได้หรือไม่ที่จะมีเชลล์ล็อกอินที่ไม่ทำงาน?
ในการตีความผังงานนี้ ฉันพบว่าในคนทุบตี: เมื่อ bash ถูกเรียกใช้เป็นเชลล์ล็อกอินแบบโต้ตอบหรือเป็นเชลล์แบบไม่โต้ตอบที่มีตัวเลือก --login มันจะอ่านและเรียกใช้คำสั่งจากไฟล์ / etc / profile ก่อนหากไฟล์นั้นมีอยู่ ระบุว่าเชลล์ล็อกอินแบบโต้ตอบอ่าน/etc/profile(โดยไม่มี --noprofile) นอกจากนี้เชลล์ที่ไม่มีการโต้ตอบพร้อมตัวเลือกการ--loginอ่าน/etc/profile ที่ดูเหมือนว่าจะปล่อยให้บางอย่างที่เป็นไปได้เข้าสู่ระบบเปลือกหอย (ซึ่ง$0เริ่มต้นด้วย-) ที่ถูกไม่โต้ตอบ (เรียกใช้สคริปต์ที่อาจจะเป็นง่ายๆเป็นdate) อาจจะไม่อ่าน /etc/profile(ที่มา) หากต้องการยืนยันหรือปฏิเสธแนวคิดนี้: ก่อนอื่นฉันพยายามใช้su -l -ซึ่งเริ่มต้นเชลล์การเข้าสู่ระบบด้วย-อักขระตัวแรก แต่ฉันไม่สามารถทำให้มันเป็นแบบไม่โต้ตอบ (และสามารถแสดงการทดสอบเพื่อตรวจสอบได้) เรียกสิ่งที่ชอบ $ bash -c 'date' -bash ไม่รายงานว่าเป็นเชลล์ล็อกอิน (แม้ว่าอักขระตัวแรกคือ-) ลองใช้วิธีนี้เพื่อเปิดเผยรายละเอียด: $ bash -c 'echo "$0 $- ||$(shopt -p login_shell)||";date' -bash -bash hBc ||shopt -u …
11 bash  login  startup  bashrc 

2
เพิ่มเครื่องหมายสแลชต่อท้ายในการทุบตีลิงก์สัญลักษณ์ไดเรกทอรี
ฉันมีลิงก์สัญลักษณ์สำหรับไดเรกทอรี เช่น ln -s /tmp /xxx ตอนนี้เมื่อฉันพิมพ์/xxและกดtabปุ่ม bash จะทำให้สายสมบูรณ์/xxx ถ้าฉันกดอีกครั้งมันจะกลายเป็น /xxx/ ตอนนี้วิธีการที่ฉันสามารถขอทุบตีจะสมบูรณ์/xxไป/xxx/โดยอัตโนมัติ (ในกรณีที่มีเพียงหนึ่งในการแข่งขัน)

1
bash ปรับขนาดไม่ถูกต้องภายในคอนเทนเนอร์ Docker แบบโต้ตอบ
ทุกครั้งที่มีการเปลี่ยนแปลงขนาดเทอร์มินัลโดยปกติbashจะเป็นresizeโดยอัตโนมัติเพื่อให้LINESและCOLUMNSจะคำนวณใหม่อย่างถูกต้อง แต่ด้วยเหตุผลบางอย่างสิ่งนี้ไม่ทำงานภายในคอนเทนเนอร์ Docker ที่ทำงานbashแบบโต้ตอบ ฉันมีshopt checkwinsize -sของฉันbashrcในคอนเทนเนอร์ Docker (และตรวจสอบว่ามีการonใช้งานshopt) เหมือนกับbashเซสชันโฮสต์ ฉันคิดไม่ออกจริงๆ shopt checkwinsize -sเป็นวิธีเดียวที่ฉันได้พบว่าได้รับbashการประเมินโดยอัตโนมัติresizeเมื่อปรับขนาดหน้าต่าง
11 bash  docker 

4
คำสั่ง Bash prompt execute ทุกครั้งที่มีพรอมต์ใหม่ปรากฏขึ้น
ฉันมีพรอมต์ต่อไปนี้ในทุบตีซึ่งแสดงสาขา git ปัจจุบัน: PS1+="$(git_prompt)" #git_prompt is a function in my .bashrc ซึ่งทำงานเมื่อฉันจัดหา. bashrc แต่ไม่ใช่เมื่อฉันเปลี่ยนสาขาดังนั้น PS1 var จะได้รับการประเมินเฉพาะเมื่อฉันจัดหาที่. bashrc แต่ควรได้รับการประเมินทุกครั้งที่มีการแสดงพรอมต์ใหม่ สิ่งนี้สามารถทำได้ด้วย bash 4.3?
11 bash  prompt 

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