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

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

12
เหตุใดจึงต้องเขียนสคริปต์ทุบตีทั้งหมดในฟังก์ชั่น
ที่ทำงานฉันเขียนสคริปต์ทุบตีบ่อยๆ หัวหน้างานของฉันแนะนำว่าสคริปต์ทั้งหมดจะถูกแบ่งเป็นฟังก์ชั่นคล้ายกับตัวอย่างต่อไปนี้: #!/bin/bash # Configure variables declare_variables() { noun=geese count=three } # Announce something i_am_foo() { echo "I am foo" sleep 0.5 echo "hear me roar!" } # Tell a joke walk_into_bar() { echo "So these ${count} ${noun} walk into a bar..." } # Emulate a pendulum clock for a …

3
รีเฟรชตัวแปร env หลังจากแก้ไขไฟล์ bashrc
ฉันแก้ไข.bashrcไฟล์เพื่อส่งออกตัวแปรสภาพแวดล้อมใหม่บ่อยครั้ง แทนที่จะปิดคอนโซลและเริ่มใหม่เพื่อรีเฟรชตัวแปร env มีวิธีที่สะดวกในการรีเฟรชหรือไม่?

6
วิธีที่จะสะท้อนปัง!
ฉันพยายามสร้างสคริปต์โดยecho'ing เนื้อหาลงในไฟล์แทนที่จะเปิดมันด้วยเครื่องมือแก้ไข echo -e "#!/bin/bash \n /usr/bin/command args" > .scripts/command เอาท์พุท : bash:! / bin / bash: ไม่พบเหตุการณ์ ฉันได้แยกพฤติกรรมแปลกนี้ไปปัง $ echo ! ! $ echo "!" bash: !: event not found $ echo \#! #! $ echo \#!/bin/bash bash: !/bin/bash: event not found ทำไมปังทำให้สิ่งนี้ "กิจกรรม" ที่ทุบตีหมายถึงอะไร ฉันจะแก้ไขปัญหานี้แล้วพิมพ์ "#! / bin …

3
`ใช่ 'เขียนไฟล์อย่างรวดเร็วอย่างไร?
ขอยกตัวอย่าง: $ timeout 1 yes "GNU" > file1 $ wc -l file1 11504640 file1 $ for ((sec0=`date +%S`;sec<=$(($sec0+5));sec=`date +%S`)); do echo "GNU" >> file2; done $ wc -l file2 1953 file2 ที่นี่คุณสามารถเห็นได้ว่าคำสั่งyesเขียน11504640เส้นในครั้งที่สองในขณะที่ฉันสามารถเขียนเพียง1953บรรทัดใน 5 วินาทีโดยใช้ทุบตีของและforecho ตามที่แนะนำในข้อคิดเห็นมีเทคนิคต่าง ๆ เพื่อให้มีประสิทธิภาพมากขึ้น แต่ไม่มีใครเข้ามาใกล้เคียงกับความเร็วของyes: $ ( while :; do echo "GNU" >> file3; done) & pid=$! …
58 bash  coreutils  write  yes 

1
คำสั่งเดียวเพื่อเข้าสู่ระบบ SSH และเรียกใช้โปรแกรม?
มีวิธีการโครงสร้างคำสั่งเดียวเพื่อเข้าสู่ระบบผ่าน SSH ไปยังเซิร์ฟเวอร์ระยะไกลและเรียกใช้โปรแกรมบนเปลือกเข้าสู่ระบบระยะไกลหรือไม่? ในคู่มือ OpenSSH จะอ่านว่า "หากระบุคำสั่งไว้คำสั่งจะถูกดำเนินการบนรีโมตโฮสต์แทนเชลล์ล็อกอิน" ตัวอย่างเช่นssh user@server mailจะเข้าสู่เซิร์ฟเวอร์ระยะไกลแสดงสถานะกล่องจดหมายจากนั้นกลับสู่เชลล์ภายในเครื่อง มีวิธีที่จะอยู่บนเปลือกระยะไกลหลังจากการแสดงสถานะจดหมายหรือไม่? นอกจากนี้ssh user@server [command]ดูเหมือนว่าจะไม่ทำงานหากคำสั่งเป็นโปรแกรมเช่น vim หรือ mutt มีวิธีการล็อกอินเข้าสู่ remote shell และรันโปรแกรมในขณะที่อยู่ใน remote shell ในระหว่างโปรแกรมและหลังจากออกจากโปรแกรมในที่สุดก็ออกจากlogoutคำสั่งเฉพาะเท่านั้น(เหมือนในเซสชัน SSH ปกติ)? ในที่สุดฉันก็ต้องการที่จะสามารถวางคำสั่งดังกล่าวเป็นนามแฝงใน. bashrc ในพื้นที่เพื่อให้มันสามารถทำงานได้อย่างรวดเร็วเมื่อต้องการ ตัวอย่างจะเข้าสู่ระบบผ่าน SSH ไปยังเซิร์ฟเวอร์ระยะไกลและเปิด mutt บนเซิร์ฟเวอร์ระยะไกลเพื่ออ่านหรือส่งอีเมล
58 bash  shell  ssh  openssh 

3
“ rm ถูกแฮช” หมายความว่าอย่างไร
ฉันจะผ่านhttp://mywiki.wooledge.org/BashGuide/CommandsAndArgumentsและเจอสิ่งนี้: $ type rm rm is hashed (/bin/rm) $ type cd cd is a shell builtin ก่อนหน้านี้เพียงเล็กน้อยคู่มือที่แสดงรายการคำสั่งประเภทต่างๆที่เข้าใจโดย Bash: aliases, function, builtins, keyword และ executables แต่ก็ไม่ได้พูดถึง "hashed" ดังนั้นในบริบทนี้ "แฮช" หมายถึงอะไร
58 bash  shell  command 

5
cd โดยเพียงพิมพ์ชื่อไดเรกทอรี?
ฉันมีสิ่งนี้เมื่อ 20 ปีก่อนหรือฉันฝันเกี่ยวกับมัน โดยทั่วไป: ถ้าblobblobฉันพิมพ์ blobblob: command not found ยุติธรรมพอสมควร ฉันต้องการมันเพื่อให้เมื่อเปลือกของฉันได้รับข้อผิดพลาด - ไม่พบคำสั่ง - มันจะตรวจสอบเพื่อดูว่ามีไดเรกทอรีที่มีชื่อนั้น ('blobblob') หรือไม่และถ้ามันcdเป็นไดเรกทอรีนั้น ฉันแน่ใจว่ามีเหตุผลบางอย่างที่จะไม่ทำเช่นนี้หรือทำอย่างระมัดระวัง ฉันคิดว่ามันจะค่อนข้างเรียบร้อยและฉันอยากลองโดยการค้นหาว่าที่ไหนสักแห่ง (เช่นที่นี่!) ฉันไม่ทราบวิธีการเขียนโปรแกรม kinda shell ซึ่งอาจบอกเป็นนัย

4
รับเส้นทางของสคริปต์ปัจจุบันเมื่อดำเนินการผ่าน symlink
ฉันมียูทิลิตี้ที่ประกอบด้วยไดเรกทอรีคู่ที่มีสคริปต์ทุบตีและไฟล์สนับสนุนที่จะนำไปใช้กับเครื่องหลายเครื่องในไดเรกทอรีที่แตกต่างกันในแต่ละเครื่อง สคริปต์ต้องสามารถอ้างอิงพา ธ ที่สัมพันธ์กับตัวเองดังนั้นฉันจึงต้องสามารถรับพา ธ ไปยังไฟล์ที่ถูกเรียกใช้งานในปัจจุบัน ฉันรู้dirname $0สำนวนที่ใช้งานได้อย่างสมบูรณ์แบบเมื่อสคริปต์ของฉันถูกเรียกใช้โดยตรง น่าเสียดายที่มีความปรารถนาที่จะสามารถสร้างการเชื่อมโยงไปยังสคริปต์เหล่านี้จากไดเรกทอรีที่แตกต่างกันโดยสิ้นเชิงและยังคงมีการทำงานแบบลอจิกการทำเส้นทางแบบสัมพัทธ์ ตัวอย่างของโครงสร้าง driectory โดยรวมมีดังนี้: / |-usr/local/lib | |-foo | | |-bin | | | |-script.sh | | |-res | | | |-resource_file.txt |-home/mike/bin | |-link_to_script (symlink to /usr/local/lib/foo/bin/script.sh) ฉันจะอ้างอิงอย่างน่าเชื่อถือได้/usr/local/lib/foo/res/resource_file.txtจากscript.shว่ามันถูกเรียกโดย/usr/local/lib/foo/bin/script.shหรือ~mike/bin/link_to_script?

3
ใช้ & (เครื่องหมายแอมเปอร์แซนด์) ในการวนซ้ำบรรทัดเดียว
ฉันใช้คำสั่งนี้เรียบร้อยแล้วซึ่งเปลี่ยนตัวแปรในไฟล์ปรับแต่งแล้วเรียกใช้งานสคริปต์ Python ภายในลูป: for((i=114;i<=255;i+=1)); do echo $i > numbers.txt;python DoMyScript.py; done เนื่องจากDoMyScript.pyตัวมันเองใช้เวลาประมาณ 30 วินาทีในการวิ่งก่อนที่จะยุติฉันต้องการผลักไสพวกมันให้เป็นแบ็คกราวน์ในขณะที่อีกอันสามารถเกิดใหม่ได้ ฉันได้ลองสิ่งที่ฉันคุ้นเคยแล้วโดยเพิ่มแอมเปอร์แซนด์เป็นด้านล่าง: for((i=114;i<=255;i+=1)); do echo $i > numbers.txt;python DoMyScript.py &; done อย่างไรก็ตามผลลัพธ์นี้มีข้อผิดพลาดด้านล่าง: -bash: ข้อผิดพลาดทางไวยากรณ์ใกล้โทเค็นที่ไม่คาดคิด `; '


3
grep ภายในน้อยลงหรือไม่
ขณะนี้ฉันกำลังตรวจสอบบันทึกที่ไม่คุ้นเคยจำนวนมากเพื่อค้นหาปัญหาบางอย่าง ไฟล์แรกที่ฉันดูคือ Events.log และฉันได้รับอย่างน้อยสามหน้าlessซึ่งดูเหมือนจะแสดงเหตุการณ์เดียวกันในเวลาที่ต่างกัน - เหตุการณ์ที่ดูเหมือนจะไม่เป็นธรรม ฉันต้องการที่จะกรองเหตุการณ์นี้ออกและตอนนี้ฉันออกlessและทำอะไรบางอย่างเช่น grep -v "event text" Events.log | less ตอนนี้นำเหตุการณ์ทั่วไปที่ไม่น่าสนใจอื่น ๆ จำนวนมากที่ฉันต้องการกรองออก มีวิธีที่ฉันสามารถgrep -v อยู่ข้างในของless? แทนที่จะต้องทำ egrep -v "event text|something else|the other thing|foo|bar" Events.log | less มันทำให้ฉันเป็นคุณลักษณะที่มีประโยชน์เมื่อดูแฟ้มบันทึกชนิดใด - และถ้าlessไม่ใช่เครื่องมือมีคุณสมบัติอื่นที่ฉันต้องการหรือไม่ เพียงแค่lessผู้ชมสไตล์ที่มีในgrepตัว
58 bash  grep  logs  less 

4
รายการไดเรกทอรีย่อยเพียงระดับลึก
เทศกาลจัดเก็บข้อมูล voicepack ในโครงสร้างไดเรกทอรีตัวอย่างต่อไปนี้: /usr/share/festival/voices/<language>/<voicepack name> หนึ่งซับที่ง่ายที่สุด (ควรใช้ls) ในการพิมพ์เฉพาะ<voicepack name>ในทุก<language>ไดเรกทอรีย่อยที่อาจเกิดขึ้นคืออะไร?
58 bash  ls 

8
เหตุใดแหล่งข้อมูลของ Bash จึงไม่ต้องการบิตการประมวลผล
ด้วย Bash sourceคุณสามารถรันสคริปต์โดยไม่ต้องตั้งค่าบิตเรียกใช้งาน นี่เป็นเอกสารและมีพฤติกรรมที่คาดหวัง แต่สิ่งนี้ไม่ได้เกิดจากการใช้งานบิตการดำเนินการใช่หรือไม่ ฉันรู้ว่านั่นsourceไม่ได้สร้าง subshell

6
การใช้ jq เพื่อแยกค่าและรูปแบบใน CSV
ฉันมีไฟล์ JSON ด้านล่าง: { "data": [ { "displayName": "First Name", "rank": 1, "value": "VALUE" }, { "displayName": "Last Name", "rank": 2, "value": "VALUE" }, { "displayName": "Position", "rank": 3, "value": "VALUE" }, { "displayName": "Company Name", "rank": 4, "value": "VALUE" }, { "displayName": "Country", "rank": 5, "value": "VALUE" }, ] …
57 bash  python  csv  json  jq 

7
ใส่คำสั่ง history ลงบนบรรทัดคำสั่งโดยไม่ต้องดำเนินการ
ฉันใช้! n โดยที่ (n) คือหมายเลขบรรทัดสำหรับการดำเนินการบรรทัดในไฟล์ประวัติที่ฉันต้องการดำเนินการที่พรอมต์คำสั่งที่ฉันค้นหาผ่าน history | less แต่มีเหตุการณ์ประวัติบรรทัดคำสั่งที่ฉันต้องการแก้ไขด้วยตนเอง ฉันจะแทรกเนื้อหาเหตุการณ์ประวัติศาสตร์โดยไม่ดำเนินการในบรรทัดคำสั่งได้อย่างไรเพื่อให้ฉันสามารถแก้ไขและกดกลับได้ ที่ดีที่สุด

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