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

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

3
พรอมต์ PS1 เพื่อแสดงเวลาที่ผ่านไป
ขณะนี้ฉันใช้สิ่งนี้เพื่อแสดงเวลาปัจจุบันใน bash prompt ของฉัน: PS1=\[\e[0;32m\]\t \W>\[\e[1;37m\] 20:42:23 ~> เป็นไปได้หรือไม่ที่จะแสดงเวลาที่ผ่านไปตั้งแต่พรอมต์ก่อนหน้า? เช่น: 00:00:00 ~> sleep 10 00:00:10 ~> sleep 20 00:00:20 ~> สิ่งนี้ไม่มีอะไรที่เหมือนกันกับมันเป็นไปได้ไหมที่จะเปลี่ยน PS1 เป็นระยะ ๆ โดยสคริปต์ในพื้นหลัง
10 bash  prompt 

2
เหตุใดขณะหนึ่งลูปจึงหยุดหลังจากถูกระงับ
ทำไมการใช้ bash และหยุดชั่วขณะหนึ่งวงจึงหยุดลงหลังจากกลับมาทำงานต่อ ตัวอย่างสั้น ๆ ด้านล่าง $ while true; do echo .; sleep 1; done . . ^Z [1]+ Stopped sleep 1 $ fg sleep 1 $ ฉันคุ้นเคยกับสัญญาณและฉันเดาว่านี่อาจเป็นพฤติกรรมตามธรรมชาติของการทุบตีที่นี่ แต่ฉันต้องการที่จะเข้าใจมากขึ้นว่าทำไมมันทำงานในลักษณะนี้โดยเฉพาะ

3
ดำเนินการคำสั่งทุก ๆ X วินาที
ฉันต้องการที่จะดำเนินการคำสั่งนับ 10 วินาทีและมีมันดำเนินการในพื้นหลัง (จึงไม่watch?) คำตอบทั้งหมดแสดงบางอย่างเช่นต่อไปนี้ แต่จะดำเนินการ 11 ถึง 14 วินาที สิ่งนี้จะสำเร็จได้อย่างไร while true; do # perform command that takes between 1 and 4 seconds sleep 10 done

4
สร้างทางลัดอื่น `~~ 'เช่น' ~ '(โฮมไดเร็กตอรี่)
ฉันต้องการ~~ชี้ไปที่ไดเรกทอรีอื่นเพื่อให้ฉันสามารถใช้เป็นทางลัด ~ฉันต้องการให้มีฟังก์ชันเดียวกันตรงตามที่ ฉันจะทำสิ่งนี้ได้อย่างไร
10 linux  bash  ubuntu  tilde 

7
ฉันจะสร้างสคริปต์ให้นับด้วยห้าคนได้อย่างไร
ฉันพยายามสร้างสคริปต์ทุบตีที่ง่ายมากเพื่อแสดงรายการทวีคูณของห้าทั้งหมดระหว่าง 375 และ 3500 (375, 380, 385 ... ) สิ่งหนึ่งที่ฉันพยายามและไม่ได้ผลคือ: for i in {375..3500} do echo $i (($i += 5)) done ฉันสละเวลาสักครู่แล้วเขียนมันในภาษาเบสิกในเวลาประมาณ 15 วินาที: 10 count = 375 20 print count 30 count = count+5 40 if count < 3500 then goto 20 ฉันจะทำให้โปรแกรม BASIC เป็นสคริปต์ทุบตีได้อย่างไร
10 bash  shell  scripting 

1
การแทนที่ Bash พร้อมตัวแปรที่กำหนดจากรูปแบบ glob
ตัวอย่างด้านล่างอธิบายถึงปัญหา เหตุใดจึงFILENAMEพิมพ์อย่างถูกต้องเมื่อสะท้อนและรับรู้เป็นรูปแบบเมื่อใช้การทดแทน? #!/bin/bash FILEPATH_WITH_GLOB="/home/user/file_*" FILENAME=$(basename "$FILEPATH_WITH_GLOB") echo $FILENAME #file_1234 echo ${FILENAME:1:5} #ile_* <---why is this not ile_1

1
OS X, bash: ใช้งานได้กับตัวอธิบายไฟล์ที่เปิดน้อยกว่า cat ไม่ทำงาน
ในสคริปต์ทุบตีที่ฉันกำลังทำงาน (ซึ่งต้องทำงานบน Ubuntu และ OS X) ฉันต้องเปลี่ยนเส้นทางเอาต์พุตของคำสั่งหลายร้อยไปยังไฟล์ แทนที่จะเพิ่ม&>...พวกเขาทั้งหมดต่อท้ายฉันก็ทำได้ exec 9>&1 exec 5<>/tmp/some-file.txt exec 1>&5 จนถึงตอนนี้ดีมาก แต่ครึ่งหนึ่งของคำสั่งเหล่านั้นฉันต้องอ่านทุกอย่างที่เขียนไปแล้วในขณะที่เปิดไฟล์ descriptor ไว้ ตอนนี้บน Ubuntu ฉันสามารถทำได้ cat /dev/fd/5 หรือ tee </dev/fd/5 แต่ใน OS X ไม่มีอะไรถูกพิมพ์เลย (และคำสั่งจะออกทันที) อย่างไรก็ตามการใช้lessฉันสามารถดูเนื้อหาของไฟล์ทั้งสอง ฉันสามารถบรรลุผลข้างต้น (ทำงานกับทั้งสองระบบปฏิบัติการ) โดยใช้ less /dev/fd/5 | tee แต่ดูเหมือนว่าแฮ็ค ดังนั้นเหตุใดจึงlessเห็นสิ่งที่catไม่สามารถใช้กับ OS X ได้ (หรือลูกหลาน BSD ทุกคนได้รับผลกระทบหรือไม่) หรือฉันกำลังทำอะไรผิดพลาด?

1
ติดตามพารามิเตอร์บางอย่างในคำสั่งบางอย่าง
สมมติว่าฉันมีคำสั่งgit branch(เช่นมีคำสองคำ) เสมอ สิ่งที่ฉันต้องการคือการติดตามเมื่อคำสั่งนี้จะถูกดำเนินการกับข้อโต้แย้ง ตัวอย่างเช่นถ้าฉันรันคำสั่งgit branch developโดยไม่มีข้อผิดพลาดฉันต้องการบันทึกdevelopไฟล์ ฉันพยายามเขียนทับคำสั่ง git บนของฉัน.bash_profileบางอย่างเช่นนี้: git () { if [ $# -eq 3 ] then git $@ echo $2 > /path/tacked_parameters.txt else git $@ fi } แต่ดูเหมือนว่าใช้งานไม่ได้ดี มีวิธีการทำเช่นนี้?
10 bash  shell  function 

1
ป้องกันการวางหลายบรรทัดในทุบตี
ฉันมักจะใช้ctrl+cเพื่อคัดลอกข้อความจากแอปพลิเคชั่น gui บางส่วนแล้ววางลงในเทอร์มินัลอีมูเลเตอร์ (เทอร์มิเนเตอร์) โดยใช้เมนูคลิกเมาส์ขวาและวาง บางครั้งฉันลืมว่าคลิปบอร์ดมีหลายบรรทัดซึ่งเมื่อวางลงในทุบตีทำให้แต่ละบรรทัดจะ "ดำเนินการ" มีวิธีแก้ปัญหาเพื่อป้องกันการวางหลายบรรทัดทั้งหมดหรือไม่?

6
คุณจะตรวจสอบว่าไฟล์มีอยู่ใน awk ได้อย่างไร? [-d 'filename'] ล้มเหลว
ฉันกำลังพยายามสร้างรายชื่อผู้ใช้ที่มีชุดโฮมไดเรกทอรีซึ่งไม่มีอยู่จริง ดูเหมือนว่าฉันควรทำสิ่งนี้ด้วย awk แต่มีบางอย่างผิดปกติกับไวยากรณ์ของฉัน มันบอกฉันว่า "ไวยากรณ์ไม่ถูกต้อง" ที่] ผมทำอะไรผิดหรือเปล่า? awk -F: '{ if(![ -d "$6"]){ print $1 " " $3 " " $7}}' /etc/passwd รหัสสุดท้ายที่ฉันอาจจะใช้คือ: awk -F: '{if(system( "[ -d " $6 " ]") == 1 && $7 != "/sbin/nologin" ) {print "The directory " $6 " does not exist for …
10 bash  awk  directory 

3
การแทนที่คำสั่งสามารถซ้อนในการแทนที่ตัวแปรได้หรือไม่?
ฉันต้องการใช้การทดแทนตัวแปรบนสตริงเฉพาะที่ฉันเข้าถึงผ่านคำสั่ง ตัวอย่างเช่นหากฉันคัดลอกบางสิ่งลงในคลิปบอร์ดของฉันฉันสามารถเข้าถึงได้เช่นนี้ $ xclip -o -selection clipboard Here's a string I just copied. หากฉันกำหนดให้กับตัวแปรดังนั้นฉันสามารถทำการทดแทนตัวแปรได้ $ var=$(xclip -o -selection clipboard) $ echo $var Here's a string I just copied. $ echo ${var/copi/knott} Here's a string I just knotted. อย่างไรก็ตามมีวิธีการเปลี่ยนตัวแปรโดยไม่ต้องกำหนดให้กับตัวแปรหรือไม่? แนวคิดบางอย่างเช่นนี้ $ echo ${$(xclip -o -selection clipboard)/copi/knott} bash: ${$(xclip -o -selection clipboard)/copi/knott}: …

3
ไพพ์สคริปต์ด้วย“ อ่าน” เพื่อทุบตี
ฉันต้องการเรียกใช้สคริปต์โดยการไพพ์สคริปต์ผ่านbashด้วยwget(แทนที่จะรันสคริปต์โดยตรงด้วยการทุบตี) $ wget -O - http://example.com/my-script.sh | bash มันไม่ทำงานเพราะสคริปต์ของฉันมีreadข้อความอยู่ ด้วยเหตุผลบางอย่างสิ่งเหล่านี้ใช้ไม่ได้เมื่อไปป์เพื่อทุบตี: # Piping to bash works in general $ echo 'hi' hi $ echo "echo 'hi'" | bash hi # `read` works directly $ read -p "input: " var input: <prompt> # But not when piping - returns immediately $ echo …
10 bash  shell  pipe  read 

1
สะท้อนความคืบหน้าจากกระบวนการพื้นหลังโดยไม่ต้องไฮแจ็ก
พิจารณาสคริปต์ง่าย ๆhello: #!/bin/bash echo 'hello world!' ตอนนี้จากทุบตีถ้าฉันพยายามเรียกใช้ในพื้นหลัง: $ hello & [1] 12345 $ hello world! █ <--- prompt is stuck here until I hit enter! [1]+ Done $ █ <--- prompt back to normal สิ่งที่ฉันอยากเห็น: $ hello & [1] 12345 [1]+ hello world! [1]+ Done $ █ <--- prompt normal …

3
คุณจะเพิ่มตัวเลขเป็นอาร์กิวเมนต์บรรทัดคำสั่งได้อย่างไร
ฉันกำลังพยายามเพิ่ม 1 หมายเลขจากบรรทัดคำสั่งและหนึ่งหมายเลขเป็นค่าเริ่มต้น ตัวอย่างเช่น: เมื่อผู้ใช้พิมพ์หมายเลข 50 สคริปต์จะเพิ่ม 10 (เป็นหมายเลขเริ่มต้น) ./script 50 The sum of 50+ 10 is 60. นี่คือสิ่งที่ฉันมี echo -n "Please enter a number: " read number default = 10 sum = $((default + number)) // this line does not seem to work echo "The sum of $number and …
10 bash 

3
ฉันจะรันคำสั่งใน bash หลังจากการเปลี่ยนแปลงใด ๆ ใน $ PWD ได้อย่างไร
zsh มีฟังก์ชั่น hook ที่ดีรวมถึงchpwdการใช้งานฟังก์ชั่นหลังจากผู้ใช้เปลี่ยนไดเรกทอรี # zsh only function greet() { echo 'hi'; } chpwd_functions+=("greet") cd .. # hi pushd # hi popd # hi ฉันพยายามเลียนแบบสิ่งนั้นด้วยการทุบตี ข้อ จำกัด : มันต้องใช้งานได้ทั้งกระสุนแบบโต้ตอบและแบบไม่โต้ตอบซึ่งฉันคิดว่าหมายความว่ามันไม่สามารถพึ่งพาอะไรได้ $PROMPT_COMMAND ไม่สามารถกำหนดใหม่ได้cdเพราะฉันต้องการให้มันทำงานกับคำสั่งใด ๆ ที่เปลี่ยนไดเรกทอรี (เช่นpushdและpopd) มันจะต้องทำงานหลังจากคำสั่งของผู้ใช้ดังนั้นจึงtrap "my_function" DEBUGใช้งานไม่ได้เว้นแต่ฉันจะสามารถพูดได้ที่นั่น "ก่อนอื่นให้$BASH_COMMANDเราติดกับดักจากนั้นก็ทำเช่นนี้ ... " ฉันเห็นว่าฉันสามารถหลีกเลี่ยงการทำงานอัตโนมัติ$BASH_COMMAND หาก extdebugเปิดใช้งานและฟังก์ชั่นการดักจับคืนค่า 1 แต่ฉันไม่คิดว่าฉันต้องการบังคับextdebugและการกลับมา1ใช้คำสั่งที่ประสบความสำเร็จ ส่วนสุดท้าย - "เรียกใช้หลังจากคำสั่งของผู้ใช้" - เป็นสิ่งที่ฉันนิ่งงันในขณะนี้ …
10 bash  hook  pwd 

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