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

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

6
ฟังก์ชั่นตกแต่ง Bash
ในไพ ธ อนเราสามารถตกแต่งฟังก์ชั่นด้วยรหัสที่ใช้โดยอัตโนมัติและดำเนินการกับฟังก์ชั่น มีคุณสมบัติคล้ายกันในทุบตี? ในสคริปต์ที่ฉันกำลังทำงานอยู่ฉันมีสำเร็จรูปบางส่วนที่ทดสอบข้อโต้แย้งที่จำเป็นและออกหากไม่มีอยู่ - และแสดงข้อความบางอย่างหากระบุการตั้งค่าการดีบัก น่าเสียดายที่ฉันต้องใส่รหัสนี้ในทุก ๆ ฟังก์ชั่นและถ้าฉันต้องการที่จะเปลี่ยนมันฉันจะต้องแก้ไขทุกฟังก์ชั่น มีวิธีลบรหัสนี้จากแต่ละฟังก์ชั่นและนำไปใช้กับฟังก์ชั่นทั้งหมดซึ่งคล้ายกับมัณฑนากรในหลามหรือไม่?
10 bash  function 

2
บังคับให้แท็บปกติเสร็จสิ้นหากการทำให้เสร็จสมบูรณ์แบบอัจฉริยะล้มเหลว
เมื่อแท็บเสร็จสมบูรณ์กลายเป็นคุณสมบัติมาตรฐานในเชลล์ฉันมีความสุขมากที่ได้ใช้มัน ฉันยังชอบความสมบูรณ์แบบอัจฉริยะของ Bash (ซึ่งจะค้นหาเฉพาะไฟล์ PDF เท่านั้นหากฉันพิมพ์ evoo foo <TAB>) - ตราบใดที่เดาได้อย่างถูกต้อง ซากปรักหักพังเป็นวันที่มีความสุขเป็นอย่างยิ่งเมื่อ Bash ใช้ความสำเร็จที่ชาญฉลาดในการปฏิเสธการทำสิ่งนั้นให้สำเร็จ วันนี้ฉันต้องการ: tar xvf centos5.8_x86_1.ova ดังนั้นฉันเข้ามา: tar xvf cent<TAB> และ Bash ปฏิเสธที่จะทำตามเส้นทางให้เสร็จสิ้นเพราะ. Nova-files ไม่ใช่สิ่งที่คุณมักใช้กับ tar ฉันรู้ว่าฉันสามารถถอนการติดตั้งแพคเกจ bash-completion เพื่อลบความสมบูรณ์อัจฉริยะ แต่ฉันมีเค้กและกินมันด้วยได้ไหม ฉันขอให้ทุบตีใช้ความสมบูรณ์แบบอัจฉริยะก่อนหรือไม่

1
มีไฟล์ Bash ที่จะมีแหล่งที่มาในโหมดอินเตอร์แอคทีฟเสมอไม่ว่าจะเป็นการเข้าสู่ระบบหรือไม่เข้าสู่ระบบ?
เท่าที่ฉันรู้เปลือกโต้ตอบอาจเข้าสู่ระบบหรือไม่เข้าสู่ระบบและไฟล์เริ่มต้นสำหรับพวกเขาจะแตกต่างกัน ถ้าโต้ตอบ + เปลือกเข้าสู่ระบบ→ /etc/profileแล้วอ่านครั้งแรก~/.bash_profile, ~/.bash_loginและ~/.profile หากเปลือกแบบโต้ตอบ + ที่ไม่ใช่การเข้าสู่ระบบ→ /etc/bash.bashrcแล้ว~/.bashrc ฉันต้องการตั้งค่าตัวแปรบางอย่างทุกครั้งที่ฉันใช้เชลล์แบบโต้ตอบโดยไม่คำนึงว่ามันเป็นเชลล์ล็อกอินหรือไม่
10 bash  login  bashrc 

6
ทุบตีหาบรรทัดที่ขึ้นต้นด้วยสตริง
ฉันมีไฟล์หลายไฟล์และต้องการค้นหาว่าไฟล์ใดมีบรรทัดเรียงตามลำดับที่ขึ้นต้นด้วยสตริงที่แน่นอน ตัวอย่างเช่นสำหรับไฟล์ต่อไปนี้: Aaaaaaaaaaaa Baaaaaaaaaaa Cxxxxxxxxx Cyyyyyyyyy Czzzzzzzzz Abbbbbbbbbbb Bbbbbbbbbbbb Caaaaaa Accccccccccc Bccccccccccc Cdddddd Ceeeeee มีมากกว่าหนึ่งบรรทัดที่ขึ้นต้นด้วย 'C' ดังนั้นฉันต้องการให้ไฟล์นี้ถูกค้นพบโดยคำสั่ง ตัวอย่างเช่นสำหรับไฟล์ต่อไปนี้: Aaaaaaaaaaaa Baaaaaaaaaaa Cxxxxxxxxx Abbbbbbbbbbb Bbbbbbbbbbbb Caaaaaa Accccccccccc Bccccccccccc Cdddddd มีหนึ่งบรรทัดที่ขึ้นต้นด้วย 'C' เสมอฉันไม่ต้องการไฟล์นี้ ฉันคิดว่าจะใช้ a grepหรือ a sedแต่ฉันไม่รู้วิธีการใช้ อาจใช้ regexp ^C.*$^Cหรืออะไรทำนองนั้น ความคิดใด ๆ
10 bash  sed  grep  string 


4
รับขนาดโดยประมาณของไดเรกทอรี (รวมทั้งไฟล์และไดเรกทอรีย่อยซ้ำ ๆ )
มีวิธีที่จะได้ขนาดที่ถูกต้องอย่างรวดเร็วสำหรับไดเรกทอรี (รวมถึงไดเรกทอรีย่อยทั้งหมดซ้ำ)? ฉันไม่ต้องการขนาดของส่วนย่อยฉันแค่หมายความว่าควรรวมไว้ในรายงานซ้ำขนาดรวม หากเป็นเช่นนั้นจะทำให้มีขนาดโดยประมาณได้หรือไม่ ฉันกำลังคิดบางอย่างตามบรรทัดdfที่ให้การตอบสนองอย่างรวดเร็วสำหรับระบบไฟล์ทั้งหมด แต่คราวนี้เป็นไดเรกทอรีเฉพาะ (และเป็นไดเรกทอรีย่อย) โซลูชั่นที่ใช้duดูเหมือนจะใช้เวลานานเมื่อได้รับไดเรกทอรีประกอบด้วยหลายพันย่อย dirs
10 bash 

2
การเติมข้อความอัตโนมัติ Bash สำหรับตัวแปรสภาพแวดล้อมที่มีชื่อไดเรกทอรี
ฉันใช้สิ่งอื่น ๆ ทุบตี 4.2.37 บน Linux Mint 14 เมื่อฉันเติมข้อความอัตโนมัติให้กับชื่อของตัวแปรสภาพแวดล้อมโดยการพิมพ์Tabมันจะขยายเป็นชื่อของตัวแปรตามด้วยช่องว่าง /ถ้าค่าของตัวแปรที่จะเกิดขึ้นชื่อไดเรกทอรีที่ฉันต้องการที่จะขยายไปที่ชื่อของตัวแปรตาม ตัวอย่างเช่นถ้าฉันพิมพ์: $ ls $HOM<tab> มันขยายไปที่: $ ls $HOME _ โดย_ทำเครื่องหมายที่ตำแหน่งของเคอร์เซอร์ ปัญหาคือว่าฉันก็มักจะต้องการที่จะดำเนินการพิมพ์ชื่อของไฟล์บางส่วนหรือไดเรกทอรีภายใต้ไดเรกทอรีบ้านของฉันซึ่งหมายความว่าฉันต้องพิมพ์แล้วbackspace/ ดังนั้นฉันต้องการที่จะขยายไป: $ ls $HOME/_ สิ่งเดียวกันนี้เกิดขึ้นเมื่อฉันพิมพ์ชื่อตัวแปรทั้งหมด หลังจากls $HOME, เพิ่มช่องว่างและฉันต้องการที่จะเพิ่มtab/ (และแน่นอนฉันไม่ต้องการให้เพิ่ม/ถ้าค่าของตัวแปรไม่ใช่ชื่อไดเรกทอรี) มีวิธีการบางอย่างที่ฉันสามารถบอกทุบตีการปฏิบัติตนในแบบที่ฉันต้องการทั้งผ่านทางคำสั่งทุบตีหรือโดยการอัปเดตของฉัน$HOME/.inputrc? หมายเหตุ: ฉันกำลังมองหาวิธีที่จะทำให้tabพฤติกรรมในแบบที่ฉันต้องการโดยเฉพาะ วิธีในการบรรลุพฤติกรรมเดียวกันกับการกดแป้นแตกต่างกันจะน่าสนใจ แต่จะไม่ตอบคำถามของฉัน (ฉันปิดการใช้งาน/etc/profile.d/bash_completion.shในระบบของฉันเพราะมันมีปฏิสัมพันธ์ไม่ดีset -o nounsetการทดสอบอย่างรวดเร็วบ่งชี้ว่าสิ่งนี้อาจไม่เกี่ยวข้องกับคำถามของฉัน) อนึ่ง tcsh ทำสิ่งนี้: กำหนดตัวแปรสภาพแวดล้อมการ$FOOBARพิมพ์$FOOBA<tab>ขยายไปถึง$FOOBAR/ถ้ามันอ้างถึงไดเรกทอรี$FOOBAR(มีช่องว่าง) ถ้ามันไม่ได้ ไม่นั่นไม่เพียงพอที่จะชักชวนให้ฉันกลับไปที่ tcsh zsh ทำเช่นนี้เช่นกัน

4
แยกไฟล์และวางไว้ในโครงสร้างข้อมูลที่สอดคล้องกัน?
ฉันมีไฟล์ที่มีบรรทัดเดียวด้านล่าง: {machineA=[0, 1024, 4, 1028], machineB=[1, 1025, 5, 1029]} ที่ฉันมีสองชุดข้อมูล: machineA=[0, 1024, 4, 1028] machineB=[1, 1025, 5, 1029] ตอนนี้ฉันต้องอ่านไฟล์ข้างต้นและแยกมันในแบบที่ฉันสามารถดึงข้อมูลของเครื่องแต่ละเครื่องตามที่กล่าวไว้ข้างต้นและเก็บไว้ในโครงสร้างข้อมูลบางอย่าง ขณะนี้ฉันสับสนโครงสร้างข้อมูลที่ฉันควรใช้ใน bash shell script ถ้าฉันทำสิ่งนี้ใน Java ฉันจะใช้Map<String, Set<String>>แต่ฉันไม่แน่ใจว่าฉันควรใช้อะไรในเชลล์สคริปต์ และหลังจากเก็บไว้ในโครงสร้างข้อมูลฉันต้องวนซ้ำและพิมพ์ผลลัพธ์ ฉันสามารถอ่านไฟล์ด้านบนโดยใช้เชลล์สคริปต์ด้านล่าง: #!/bin/bash while read -r line; do echo "$line" done < data.txt แต่ฉันไม่แน่ใจว่าจะแยกข้อมูลบรรทัดข้างต้นด้วยวิธีดังกล่าวอย่างไรเพื่อให้ฉันสามารถดึงข้อมูลแต่ละเครื่องจากนั้นจัดเก็บไว้ในโครงสร้างข้อมูลบางส่วนได้ UPDATE: - ด้านล่างนี้คือเชลล์สคริปต์ที่ฉันได้รับหลังจากทำตามคำแนะนำที่ได้รับจากเกล็น - #!/bin/bash while read -r line; …

5
แยกไฟล์ข้อความที่คั่นด้วยทุบตีเป็นข้อโต้แย้งคำสั่ง
ฉันมีไฟล์ข้อความแยกย่อยดังนี้: field1,field2,field3 xield1,xield2,xield3 dield1,dield2,dield3 gield1,gield2,gield3 แต่ละคอลัมน์เหล่านี้จะเป็นพารามิเตอร์ของโปรแกรมและฉันต้องการให้โปรแกรมถูกเรียกสำหรับแต่ละบรรทัด ฉันหวังว่าจะวนซ้ำบางอย่างเช่น: for $i in file command $field2 -x $field3 -PN -$field1 >> output done อะไรจะเป็นวิธีที่ดีที่สุดในการบรรลุสิ่งนี้ในทุบตี?

2
โปรแกรมแบ่งพาร์ติชันดิสก์
ฉันกำลังพยายามสร้างสคริปต์ทุบตีซึ่งจะสร้างพาร์ติชันใหม่ด้วยระบบไฟล์บนดิสก์ที่มีพาร์ติชันที่มีอยู่ ดูเหมือนว่าจะง่ายต่อการสร้างพาร์ติชั่นโดยทางโปรแกรมด้วยการแยกอย่างไรก็ตามคุณต้องทราบว่าจะเริ่มต้นและหยุดพาร์ติชันใหม่ได้อย่างไรและนี่คือที่ที่ฉันมีปัญหา ฉันไม่ต้องการพึ่งพาดิสก์ที่มีพาร์ติชันในตำแหน่ง / ขนาดเฉพาะ นั่นคือฉันต้องการสร้างพาร์ติชันใหม่เริ่มทันทีหลังจากพาร์ทิชันที่มีอยู่ล่าสุด ฉันต้องการที่จะสามารถสร้างพาร์ทิชันทั้งขนาดคงที่หรือเพื่อเติมเต็มพื้นที่ที่เหลือ ใน Bash มีวิธีการกำหนดที่เชื่อถือได้ ก) ตำแหน่งสุดท้ายของพาร์ติชั่นสุดท้ายและ b) พื้นที่ที่ไม่ได้แบ่งพาร์ติชั่นที่เหลือหลังจากพาร์ติชั่นสุดท้าย?
10 bash  partition  fdisk  parted 

2
ถ้าฉันพิมพ์“ sudo” ที่จุดเริ่มต้นของสายการบินเดียวมันจะใช้กับคำสั่งที่เหลือหรือไม่?
หากฉันพิมพ์sudoที่จุดเริ่มต้นของซับในหนึ่งจะใช้กับคำสั่งที่เหลือหรือไม่? กล่าวอีกนัยหนึ่งคือ: sudo foo | foo2 | foo3 เทียบเท่ากับสิ่งนี้: sudo foo | sudo foo2 | sudo foo3
10 bash  shell  sudo 

4
การคืนค่าจากฟังก์ชัน bash
ฉันมีฟังก์ชั่นซึ่งจะคืนค่า 1 หากจำนวนนั้นเป็นตัวเลขสิบหลักที่ถูกต้อง: valNum() { flag=1 if [[ $1 != [1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] ]]; then echo "Invalid Number" flag=0 fi return $flag } มันกำลังถูกเรียกโดย: if [[ $(valNum $num) -eq 1 ]]; then #do something fi ฟังก์ชั่นทำงานได้ดีถ้าตัวเลขนั้นถูกต้อง แต่มีการแสดงข้อผิดพลาดทางไวยากรณ์หากใส่หมายเลขที่ไม่ถูกต้อง

1
คุณสามารถสร้าง "นามแฝง" ใน Bash ได้หลายวิธี
ฉันเพียงรู้ของสองวิธีและalias foo=barfunction foo() { bar } เหตุผลที่ฉันถามคือ - ทั้งหมดในเซสชัน bash ของฉัน - ฉันไม่สามารถเรียกใช้lnคำสั่งได้เนื่องจากbashมีข้อผิดพลาด-bash: /usr/local/.../ln: No such file or directory(ซึ่ง/usr/local/.../เป็นหนึ่งในรายการในPATHตัวแปรสภาพแวดล้อมของฉัน) มันไม่ใช่PATHปัญหาเพราะถ้าฉันเรียกใช้which lnมันจะเอาท์พุทไบนารีที่คาดหวังของ/usr/bin/ln(ซึ่งฉันสามารถทำงานได้ดีถ้าฉันระบุเส้นทางที่แน่นอน) ฉันยังตรวจสอบlnในของฉันaliasและfunctionประกาศและไม่มีอะไร: $ declare -f | grep ln $ alias | grep ln ปัญหากำลังเกิดขึ้นในเซสชัน bash เดียว ถ้าฉันเริ่มเชลล์ใหม่มันจะทำงานได้ดีอีกครั้ง แต่ฉันอยากรู้ว่าอะไรทำให้เกิดปัญหานี้ในทันทีในเซสชั่นของการทุบตีนี้ ความคิดใด ๆ เกี่ยวกับสิ่งที่อาจทำให้เกิดสิ่งนี้
10 bash  shell  alias 

3
ใช้ git submodule foreach พร้อมกับฟังก์ชั่น
การเยื้องของฉันคือการมีสคริปต์ที่อัปเดต submodules git ทั้งหมดตามสาขาที่ได้รับ หากไม่มีสาขาดังกล่าวสำหรับ submodule ระบบจะใช้ต้นแบบ นี่คือสิ่งที่ฉันมีตอนนี้: #!/bin/bash -x if [ -z $1 ]; then echo "Branch name required." exit fi function pbranch { exists=`git show-ref refs/heads/$branch` if [ -z $exists ]; then branch="master" fi git co $branch git pull origin $branch } branch=$1 git submodule foreach pbranch แต่เมื่อรันสคริปต์นี้ข้อผิดพลาดจะถูกโยน: …
10 bash  git 

3
วิธีการขยายขยายสัญลักษณ์แทนในทุบตี?
ฉันจำทุบตีสามารถทำต่อไปนี้: สมมติว่ามี 3 ไฟล์: a, b, c ในไดเรกทอรีปัจจุบันเมื่อฉันป้อน: $> somecommand * จากนั้นกดคีย์หรือคีย์ผสมหรือลำดับคีย์ไวด์การ์ด * ออนไลน์จะขยายเป็น: $> somecommand a b c แต่ฉันจำไม่ได้และไม่สามารถเรียงลำดับคีย์ได้! ช่วยด้วย!
10 bash 

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