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

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

5
ฉันจะจำคำสั่งประวัติที่เป็นตัวเลขเพื่อแก้ไขได้อย่างไร
ฉันมักค้นหาการเปลี่ยนแปลงด้วย history | grep 'string' ฉันได้รับรายการคำสั่งในประวัติของฉันพร้อมด้วยหมายเลขบรรทัดประวัติ) เช่น history | grep 'git' 755 git status 1535 git push origin master 1570 git merge origin/one-146 1667 git reset --hard origin/master ตอนนี้ฉันสามารถจำและรันคำสั่งได้ในครั้งเดียว!nnnตัวอย่างเช่น: !755 git status # On branch master nothing to commit, working directory clean คำถามของฉันคือ: ฉันจะจำคำสั่งประวัติศาสตร์ที่มีหมายเลขและอยู่ในบรรทัดคำสั่งสำหรับการแก้ไขและไม่ดำเนินการทันที 'ตามที่เป็น' วิธีที่!ทำเพื่อให้ฉันสามารถเปลี่ยนสองสิ่งที่แสดงก่อนที่จะกลับมา?

2
ฉันจะสตรีมข้อมูลไปยังโปรแกรมที่คาดว่าจะอ่านข้อมูลจากไฟล์ที่กำหนดเป็นอาร์กิวเมนต์ได้อย่างไร
ฉันมีไฟล์ gzipped ขนาดใหญ่และฉันต้องการโปรแกรม (4s-import ในกรณีนี้) เพื่ออ่าน ใช้เวลาในการคลายไฟล์ก่อนแล้วจึงเรียกโปรแกรมที่มีพา ธ ไปยังไฟล์เป็นอาร์กิวเมนต์ เป็นไปได้ไหมที่จะทำสิ่งที่ชอบ zcat huge.gz | 4s-import <SOME MAGIC> ที่ SOME-MAGIC เป็นเหมือนเส้นทางไปยังไฟล์นามธรรมที่มี stdin? ทางเลือกการใช้พื้นที่ดิสก์ที่ช้าลงและมากขึ้นที่ฉันต้องทำคือ: zcat huge.gz > huger 4s-import huger

3
ย้ายไฟล์และลบไดเรกทอรีด้วย rsync หรือไม่
เมื่อเร็ว ๆ นี้ฉันต้องการลบไฟล์จำนวนมาก (มากกว่า 1 ล้านไฟล์) และฉันได้อ่าน: rsync -av --delete `mktemp -d`/ ~/source && rmdir ~/source rm -rfเป็นหนึ่งในวิธีที่ดีที่สุดมากที่สุดที่จะทำเช่นนั้นและฉันสามารถรับรองว่ามันเร็วกว่า ฉันไม่ใช่ผู้เชี่ยวชาญในเรื่องนี้ แต่จากความเข้าใจของฉันแล้วเหตุผลที่ประสิทธิภาพของ rsync มีบางอย่างที่ต้องทำตามวิธีที่รายการไฟล์ (LIFO แทนที่จะเป็น FIFO ที่ฉันคิดว่า) ตอนนี้ปัญหาคือฉันต้องย้ายไฟล์จำนวนมากด้วยวิธีที่มีประสิทธิภาพ หลังจากค้นหาแล้วฉันก็พบสิ่งนี้: rsync -av --ignore-existing --remove-source-files ~/source ~/destination ขณะนี้ลบทั้งหมดย้ายไฟล์ใน~/sourceไดเรกทอรียังคงมี เนื่องจากฉันมีโครงสร้างไดเรกทอรีคล้ายกับ "round-robin" จำนวนfiles/directoriesใกล้เคียงกับ 1 ดังนั้นฉันจึงถูกบังคับให้เรียกใช้คำสั่งแรกอีกครั้งเพื่อกำจัดไดเรกทอรีทั้งหมด: rsync -av --ignore-existing --remove-source-files ~/source ~/destination && \ rsync -av …

2
ทำไมทุบตีแสดง 'ยุติ' หลังจากฆ่ากระบวนการ?
นี่คือพฤติกรรมที่ฉันต้องการเข้าใจ: $ ps PID TTY TIME CMD 392 ttys000 0:00.20 -bash 4268 ttys000 0:00.00 xargs $ kill 4268 $ ps PID TTY TIME CMD 392 ttys000 0:00.20 -bash [1]+ Terminated: 15 xargs $ ps PID TTY TIME CMD 392 ttys000 0:00.21 -bash ทำไมมันแสดงให้เห็น[1]+ Terminated: 15 xargsหลังจากที่ฉันฆ่ากระบวนการแทนที่จะไม่แสดงมันอย่างที่มันเพิ่งถูกฆ่า? ฉันใช้ทุบตีบน Mac OS X …
17 bash  process  kill 

2
แยกสตริงตามรูปแบบในสคริปต์ทุบตี
ในทุบตีสมมติว่าฉันมีสตริงstrname: strname="ph7go04325r" ฉันต้องการที่จะดึงตัวละครระหว่างครั้งแรก "3"ของตัวละครและสุดท้าย "r"ตัวละครในการประหยัดผลในสตริงstrname strresultในตัวอย่างข้างต้นผลลัพธ์strresultจะเป็น: strresult="25" "3"อักขระตัวแรกไม่จำเป็นต้องอยู่ที่ตำแหน่งสตริง 8 ในstrname; เช่นเดียวกันที่ผ่านมา"r"คือไม่จำเป็นต้องที่ตำแหน่งสตริง 11. ดังนั้นทั้งสองสายดังต่อไปนี้strnameควรผลผลิตstrresult="25": strname="ph11go04325raa" strname="325r" strname="rgo04325raa" นอกจากนี้ควรผลผลิตstrname=ph12go04330raa"strresult="30" ฉันยังใหม่กับการเขียนสคริปต์ทุบตีและฉันไม่รู้ว่าจะเริ่มจับคู่รูปแบบสตริงได้อย่างไร คุณมีข้อเสนอแนะใด?

6
วิธีทำให้ bash ใส่พรอมต์บนบรรทัดใหม่หลังจากคำสั่ง cat?
สิ่งที่ฉันได้รับ: host:~ user$ cat example.txt some texthost:~ stas$ สิ่งที่ฉันต้องการได้รับ: host:~ user$ cat example.txt some text host:~ stas$ มีวิธีที่ฉันสามารถcatประพฤติเช่นนี้หรือไม่? ฉันใช้ทุบตีใน Mac OS X
17 bash  osx  prompt  cat 

2
ข้อความ 'การแบ่งกลุ่มข้อผิดพลาด' มาภายใต้ STDERR หรือไม่
ฉันเรียกใช้ไฟล์ปฏิบัติการได้ bash ./code > log มันแสดงข้อความผิดพลาดเป็นครั้งคราวใน terminal ในขณะที่คำสั่ง printf ทั้งหมดเข้าไปในล็อกไฟล์ ฉันเรียกใช้อีกครั้งเหมือนด้านล่าง ./code >& log ตอนนี้ข้อความแสดงข้อผิดพลาดเป็นครั้งคราวก็เข้าสู่ระบบด้วยเช่นกัน แต่หากมีความผิดพลาดในการแบ่งส่วนมันจะยังคงปรากฏบนขั้ว ทำไม? จะทำให้ข้อความSegmentation fault (core dumped)เข้าไปในล็อกไฟล์ได้อย่างไร? ผู้ใช้ $ bash - รุ่น GNU ทุบตี, รุ่น 4.2.24 (1) - ปล่อย (i686-pc-linux-gnu)

3
คำสั่ง `ซึ่ง` อาจจะผิด (บางครั้ง)?
ฉันได้รวบรวมเวอร์ชั่น emacs ล่าสุดจากซอร์สโค้ด (v24.2) เพราะเวอร์ชันที่ติดตั้งในเครื่องของฉันนั้นค่อนข้างเก่าสำหรับฉัน (v21.3) ฉันทำตามปกติ: $configure --prefix=$HOME make make install ตอนนี้ฉันกำลังทดสอบ emacs และรู้ว่ามันยังคงเปิดตัวรุ่นก่อนหน้า ... ในขณะที่$HOME/binเส้นทางของฉันควรจะแทนที่ระบบหนึ่ง (เนื่องจากมีการเติมไว้ที่ $ PATH ใน.bashrcไฟล์ของฉัน) ความคิดแรกของฉันคือการเห็นwhichผลลัพธ์ของคำสั่ง และน่าประหลาดใจมันทำให้เส้นทางไปสู่ ​​emacs ใหม่ ฉันไม่เข้าใจความแตกต่างของที่นี่ ในเซสชันเดียวกันนี่คือผลลัพธ์ที่ต่างกัน: $ emacs --version GNU Emacs 21.3.1 $ `which emacs` --version GNU Emacs 24.2.1 ฉันไม่มีนามแฝงที่เกี่ยวข้องกับ emacs เลย $ alias | grep emacs $ ความคิดใดที่เกิดขึ้นได้โปรด
17 bash  emacs  path  which 

2
ใช้คำสั่ง find เพื่อแปลงไฟล์ markdown เป็น html
.mdให้คิดว่าฉันมีไฟล์บนฮาร์ดดิสก์ของฉันที่มีนามสกุลเป็น ฉันต้องการที่จะแปลงไฟล์เหล่านั้นทั้งหมดจะ.htmlผ่านfindและ-execตัวเลือก คำสั่งในการแปลงไฟล์ markdown เป็น html คือ markdown readme.md > readme.html ฉันกำลังพยายามใช้สิ่งที่ชอบ: find / -name "*.md" -type f -exec markdown {} > {}.html \; แน่นอนข้างต้นไม่ทำงาน ดังนั้นฉันจะใช้วิธีนี้ได้อย่างไรfindและexec?
17 bash  find 

5
bash: ใช้ตัวแปรเพื่อเก็บการเปลี่ยนเส้นทาง stderr | stdout
มีวิธีการเปลี่ยนเส้นทาง stdout และ stderr ผ่านตัวแปรเช่นเพิ่มตัวเลือกคำสั่งในสคริปต์ใด ๆ ตัวอย่างเช่นฉันมีสคริปต์: #!/bin/bash -x TEST=">/dev/null 2>&1" OPT='-p -v' mkdir $OPT 123/123/123 $TEST ฉันเห็นว่า OPT ถูกแทนที่ด้วย-pไม่มีปัญหาใด ๆ และทุบตีตีความมันเป็นตัวเลือก แต่การเปลี่ยนเส้นทางตีความเป็นชื่อไดเรกทอรี $ ./test.sh + TEST='>/dev/null 2>&1' + OPT='-p -v' + mkdir -p -v 123/123/123 '>/dev/null' '2>&1' mkdir: created directory `123/123' mkdir: created directory `123/123/123' mkdir: created directory `>/dev' …

3
มีขนาดสูงสุดของไฟล์ประวัติทุบตีหรือไม่?
ฉันสามารถเพิ่มขนาดของประวัติคำสั่งเป็น bash ได้หรือไม่? โปรดทราบว่าฉันใช้คอมพิวเตอร์ Red Hat Linux ในแผนกฟิสิกส์ดาราศาสตร์ระดับปริญญาตรีที่นี่ (ดังนั้นฉันจึงไม่ได้รับสิทธิพิเศษมากมาย)

3
ทุบตีสคริปต์เพื่อค้นหาและฆ่ากระบวนการด้วยอาร์กิวเมนต์บางอย่าง?
ฉันต้องการสคริปต์ที่ฆ่าอินสแตนซ์sshที่ถูกรันด้วยอาร์กิวเมนต์ -D (ตั้งค่าพร็อกซีในเครื่อง) ฉันทำด้วยตนเองps -A | grep -i sshค้นหาอินสแตนซ์ด้วย -D และkill -9 {id}แต่ละอัน แต่สิ่งที่ดูเหมือนในรูปแบบสคริปต์ทุบตี? (ฉันใช้ Mac OS X แต่จะติดตั้งคำสั่งที่จำเป็นผ่านport)
17 bash  process 

2
เปลี่ยนไดเรกทอรีโดยไม่ต้องพิมพ์ cd?
มันเป็นไปได้ที่จะทำให้การเปลี่ยนไดเรกทอรีทุบตีในบรรทัดคำสั่งง่ายๆโดยพิมพ์ไดเรกทอรีว่าไม่มีคำสั่งใด ๆ เช่นcd? ตัวอย่างเช่นเป็นไปได้แทนที่จะเขียนสิ่งนี้: $ cd /tmp ฉันแค่อยากจะเขียนสิ่งนี้เท่านั้น: $ /tmp กล่าวอีกนัยหนึ่งถ้าฉันเรียกไดเรกทอรีเป็นแอปพลิเคชันแล้วฉันต้องการตั้งค่าไดเรกทอรีนั้นเป็นไดเรกทอรีที่ใช้งานได้

4
ลำดับความสำคัญของ Pipe (|) และตรรกะและ (&&) ใน bash
สถานการณ์สุดคลาสสิกกับโอเปอเรเตอร์สำคัญคุณมีบรรทัดเหมือน: (cd ~/screenshots/ && ls screenshot* | head -n 5) และคุณไม่รู้ว่ามันแยกวิเคราะห์((A && B) | C)หรือ(A && B | C)... เอกสารอย่างเป็นทางการเกือบจะพบที่นี่ไม่ได้แสดงรายการท่อในรายการดังนั้นผมจึงไม่สามารถเพียงแค่ตรวจสอบในตาราง นอกจากนี้ใน bash (ไม่เพียง แต่เปลี่ยนลำดับการดำเนินการ แต่สร้าง subshellดังนั้นฉันจึงไม่ 100% แน่ใจว่าบรรทัดนี้เทียบเท่ากับบรรทัดก่อนหน้า: ((cd ~/screenshots/ && ls screenshot*) | head -n 5) โดยทั่วไปแล้วจะรู้ASTของ bash line ได้อย่างไร? ในหลามฉันมีฟังก์ชั่นที่ให้ต้นไม้กับฉันเพื่อให้ฉันสามารถตรวจสอบลำดับการทำงานได้อย่างง่ายดาย
17 bash 

3
เชลล์ล่ามคนใดเรียกใช้สคริปต์โดยไม่มี shebang?
สมมติว่าเชลล์เริ่มต้นสำหรับบัญชีของฉันคือ zsh แต่ฉันเปิดเทอร์มินัลและยิงทุบตีและเรียกใช้สคริปต์ชื่อprac002.shซึ่งล่ามเชลล์ใดที่จะใช้ในการรันสคริปต์ zsh หรือ bash? ลองพิจารณาตัวอย่างต่อไปนี้: papagolf@Sierra ~/My Files/My Programs/Learning/Shell % sudo cat /etc/passwd | grep papagolf [sudo] password for papagolf: papagolf:x:1000:1001:Rex,,,:/home/papagolf:/usr/bin/zsh # papagolf's default shell is zsh papagolf@Sierra ~/My Files/My Programs/Learning/Shell % bash # I fired up bash. (See that '%' prompt in zsh changes to '$' prompt, …

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