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

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

3
บันทึกรหัสออกในภายหลัง
ดังนั้นฉันจึงมีสคริปต์เล็กน้อยสำหรับการทดสอบบางอย่าง javac *.java && java -ea Test rm -f *.class ตอนนี้ปัญหาของเรื่องนี้ก็คือเมื่อฉันเรียกใช้สคริปต์./testก็จะส่งกลับรหัสทางออกที่ประสบความสำเร็จแม้ว่าการทดสอบล้มเหลวเพราะrm -f *.classประสบความสำเร็จ วิธีเดียวที่ฉันสามารถคิดให้มันทำในสิ่งที่ฉันต้องการรู้สึกน่าเกลียด: javac *.java && java -ea Test test_exit_code=$? rm -f *.class if [ "$test_exit_code" != 0 ] ; then false; fi แต่ดูเหมือนว่ามีปัญหาบางอย่างที่พบได้ทั่วไป - ทำงานทำความสะอาดแล้วส่งคืนรหัสทางออกของงานต้นฉบับ อะไรคือวิธีที่ใช้สำนวนที่สุดในการทำสิ่งนี้ (โดยทั่วไปคือทุบตีหรือแค่กระสุน)?

1
อะไรคือความแตกต่างระหว่าง @ และ * เมื่ออ้างอิงค่า bash array?
คู่มือ Bash นี้พูดว่า: หากหมายเลขดัชนีคือ @ หรือ * สมาชิกทั้งหมดของอาร์เรย์จะถูกอ้างอิง เมื่อฉันทำสิ่งนี้: LIST=(1 2 3) for i in "${LIST[@]}"; do echo "example.$i " done ให้: example.1 example.2 example.3(ผลลัพธ์ที่ต้องการ) แต่เมื่อฉันใช้${LIST[*]}ฉันได้รับexample.1 2 3แทน ทำไม? แก้ไข: เมื่อใช้ printf, @ และ * จริงจะให้ผลลัพธ์เดียวกัน
15 bash  array 

5
แปลงไดเรกทอรีเป็นไฟล์หรือไฟล์เป็นไดเรกทอรี
testผมอยากจะสร้างไฟล์ชื่อ บังเอิญผมทำงานแทนmkdir testtouch test เป็นไปได้ไหมที่จะแปลงtestสารบบในไฟล์ชื่อtest? สิ่งที่เกี่ยวกับการแปลงไฟล์ชื่อtestเป็นไดเรกทอรีที่มีชื่อเดียวกัน?
15 linux  bash  files  directory 

3
ทำไม 'echo $ 0' ให้ผลลัพธ์ที่ต่างกันสำหรับเทอร์มินัลสองเครื่องที่แตกต่างกัน
ฉันเปิดเทอร์มินัลบน Ubuntu โดยใช้Ctrl+ Alt+ Tและเทอร์มินัลอื่นโดยไปที่ไดเรกทอรีแล้วคลิกขวาและเลือก "เปิดในเทอร์มินัล" ฉันทำecho $0ทั้งสองกรณี ในกรณีแรก: $ echo $0 -bash ในกรณีที่สอง: $ echo $0 /bin/bash ทำไมความแตกต่างนี้

2
GLOBIGNORE ทำงานอย่างไร
ตามหน้าคู่มือของ bash: GLOBIGNORE A colon-separated list of patterns defining the set of filenames to be ignored by pathname expansion. If a filename matched by a pathname expansion pattern also matches one of the patterns in GLOBIGNORE, it is removed from the list of matches. อย่างไรก็ตามในทางปฏิบัติ ... $ bash --noprofile --norc …

4
วิธีการทุบตียกเลิกการดำเนินการของสคริปต์ในข้อผิดพลาดทางไวยากรณ์หรือไม่
เพื่อความปลอดภัยฉันต้องการทุบตียกเลิกการทำงานของสคริปต์หากพบข้อผิดพลาดทางไวยากรณ์ ฉันประหลาดใจมากฉันไม่สามารถทำสิ่งนี้ได้ ( set -eไม่เพียงพอ) ตัวอย่าง: #!/bin/bash # Do exit on any error: set -e readonly a=(1 2) # A syntax error is here: if (( "${a[#]}" == 2 )); then echo ok else echo not ok fi echo status $? echo 'Bad: has not aborted execution on syntax error!' …

3
กำหนดค่าลูกศรขึ้นเพื่อเรียกดูคำสั่งที่มีอักขระเริ่มต้นเหมือนกันแทนที่จะเป็นคำสั่งก่อนหน้าทั้งหมด
ในbashบรรทัดคำสั่ง↑ให้ฉันคำสั่งก่อนหน้า ในคำสั่งบรรทัดในnumpyหรือmatlabเมื่อฉันพิมพ์ตัวอักษรไม่กี่ทำให้ผมมีคำสั่งก่อนหน้านี้ที่เริ่มต้นด้วยตัวอักษรเหล่านั้น↑ ฉันจะเปิดใช้งานลักษณะการทำงานนี้ได้bashอย่างไร ฉันทราบวิธีการค้นหาขั้นสูงเพิ่มเติมผ่านประวัติบรรทัดคำสั่ง แต่บางครั้งวิธีที่ง่ายกว่าก็สะดวกกว่า
15 bash  readline 

1
ประวัติทุบตีด้วยการประทับเวลา
ฉันต้องการเก็บเวลาประทับของคำสั่งที่บันทึกใน Bash $ HISTFILE ของฉันเป็นไปได้หรือไม่ ฉันไม่ได้จัดการตั้งค่าโดยใช้ man bashเป็นแหล่งข้อมูล ตัวเลือกอื่น ๆ ของฉันมีดังนี้: function thebanana() { local -r -a bash_commands=( "ls" # ... more coconut commands ) for bash_command in "${bash_commands[@]}"; do printf "${bash_command}" printf ":" done } export HISTFILE=banana export HISTIGNORE="$(thebanana)" export HISTSIZE=999999 export HISTFILESIZE=999999999 export HISTCONTROL=ignoredups:erasedups ฉันควรจะกล่าวถึงฉันใน OS X Mountain …

5
ทำไม grep ไม่ทำงานกับการเปลี่ยนเส้นทาง?
การใช้topคำสั่งด้วยการเปลี่ยนเส้นทางทำงานได้ดี: top > top.log ตอนนี้ฉันต้องการใช้ grep เพื่อกรองบรรทัด: top | grep "my_program" > top.log แต่ไฟล์บันทึกจะว่างเปล่า แต่ grep ให้เอาต์พุตเมื่อใช้ top | grep "my_program" ไหนmy_programจะต้องมีการแทนที่ด้วยโปรแกรมวิ่งไปดูการส่งออกบางส่วน ทำไมวิธีการของฉันไม่ทำงาน และฉันจะแก้ไขได้อย่างไร
15 bash  grep 

3
ใช้เข้า / ออกชื่อไปป์สำหรับการเชื่อมต่อ TCP
ฉันเล่นซอให้เรื่องนี้ทำงานได้ซักพักแล้วดังนั้นฉันจึงสงสัยว่าความเข้าใจผิดพื้นฐานบางอย่างเกี่ยวกับการทำงานของท่อเป็นสาเหตุของปัญหาของฉัน เป้าหมายของฉันคือการเริ่มต้นการเชื่อมต่อ TCP ไปยังรีโมตโฮสต์ผ่านnetcatและมีไพพ์ที่มีชื่อสองไฟล์ในระบบไฟล์: กระบวนการหนึ่งที่กระบวนการสามารถอ่านเพื่อรับข้อมูลขาเข้าและอื่น ๆ ที่กระบวนการสามารถเขียนไปยังข้อมูลขาออก ฉันกำลังใช้สิ่งก่อสร้างต่อไปนี้: mkfifo in mkfifo out cat out | netcat foo.bar.org 4000 > in & จากที่นี่ฉันต้องการอนุญาตให้กระบวนการอื่นอ่านและเขียนไปยัง / จากการเชื่อมต่อ TCP แบบเปิดนี้ ควร "ใช้งานได้" หรือมีเหตุผลว่าทำไมการสร้างเช่นนี้ไม่สามารถใช้งานได้? สิ่งที่ดูเหมือนจะเกิดขึ้นในปัจจุบันคือฉันสามารถอ่านได้outโดยไม่มีปัญหา แต่เมื่อฉันเขียนถึงinฉันรับเอาท์พุทพูดถึงท่อที่ขาดและการสื่อสารที่ตามมาทั้งหมดดูเหมือนจะตาย คิด? (ที่เกี่ยวข้อง: ฉันใช้มา แต่เดิม: netcat foo.bar.org 4000 < out > in & แต่พบว่ามันบล็อกการรอการป้อนข้อมูล ฉันอยากรู้เกี่ยวกับสิ่งนี้เช่นกัน แต่มันอาจจะดีกว่าในคำถามที่แยกต่างหาก)
15 bash  pipe  tcp  netcat 

2
บีบอัดไดเรกทอรีโดยใช้ tar / gz ผ่าน SSH ไปยังเครื่องคอมพิวเตอร์หรือไม่
ฉันต้องการ tar / gz เป็นไดเรกทอรีบนเครื่องระยะไกลและบันทึกไฟล์ลงในเครื่องคอมพิวเตอร์ของฉันโดยไม่ต้องเชื่อมต่อกลับเข้าไปในเครื่องของฉันจากเครื่องระยะไกล มีวิธีการทำเช่นนี้กับ SSH หรือไม่? ไฟล์ tar ไม่จำเป็นต้องเก็บไว้ในเครื่องระยะไกลเฉพาะในเครื่องท้องถิ่น เป็นไปได้ไหม
15 bash  ssh  tar 

3
ฉันจะจัดการข้อมูลไบนารีดิบในท่อทุบตีได้อย่างไร
ฉันมีฟังก์ชั่นทุบตีที่ใช้ไฟล์เป็นพารามิเตอร์ตรวจสอบไฟล์ที่มีอยู่แล้วเขียนสิ่งที่มาจาก stdin ไปยังไฟล์ โซลูชันไร้เดียงสาทำงานได้ดีสำหรับข้อความ แต่ฉันมีปัญหากับข้อมูลไบนารีโดยพลการ echo -n '' >| "$file" #Truncate the file while read lines do # Is there a better way to do this? I would like one... echo $lines >> "$file" done
15 bash  shell  binary 

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

2
ส่งผ่านพารามิเตอร์บรรทัดคำสั่งไปยังโปรแกรมภายในเชลล์สคริปต์
ในฐานะที่เป็น./script.sh arg1 [arg2 arg3 ...]ข้อโต้แย้งบรรทัดคำสั่งarg1, arg2... สามารถได้โดย$1, $2... แต่จำนวนของการขัดแย้งจะไม่ได้รับการแก้ไข ในเชลล์สคริปต์ฉันต้องการส่งอาร์กิวเมนต์ที่เริ่มต้นจากarg2ไปยังโปรแกรม #/bin/bash ... /path/to/a/program [I want to pass arg2 arg3 ... to the program] ... ฉันจะทำอย่างไรเพราะอาจมีข้อโต้แย้งอย่างน้อยหนึ่งข้อ

5
สร้างดัชนีสตริงใน bash
ฉันจะอ้างถึงสตริงตามดัชนีใน sh / bash ได้อย่างไร? นั่นคือโดยทั่วไปมันแยก ฉันพยายามตัดชื่อไฟล์ 5 ตัวอักษร ชื่อทั้งหมดมีโครงสร้าง: name_nr_code ฉันกำลังพยายามลบบิตรหัสตัวอักษรและตัวเลข 5 ตัว name_nr_มีความยาว 10 อักขระเสมอ มีสิ่งที่ชอบ; for i in * ; do mv "$i" "$i"[:10] ; done
15 bash  shell  string 

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