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

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

2
bash ไม่สามารถเก็บ hexvalue 0x00 ในตัวแปรได้
ฉันพยายามจะเล่นกลกับ dd ฉันคิดว่ามันจะเป็นไปได้ที่จะเก็บ hexvalues ​​บางอย่างในตัวแปรที่เรียกว่า "header" เพื่อไพพ์ลงใน dd ขั้นตอนแรกของฉันที่ไม่มีตัวแปรคือ: $ echo -ne "\x36\xc9\xda\x00\xb4" |dd of=hex $ hd hex 00000000 36 c9 da 00 b4 |6....| 00000005 หลังจากนั้นฉันลองทำสิ่งนี้: $ header=$(echo -ne "\x36\xc9\xda\x00\xb4") $ echo -n $header | hd 00000000 36 c9 da b4 |6...| 00000004 อย่างที่คุณเห็นฉันสูญเสีย\x00คุณค่าใน$headerตัวแปร ใครบ้างมีคำอธิบายสำหรับพฤติกรรมนี้หรือไม่? นี่ทำให้ฉันบ้า
11 linux  bash  shell-script  dd 

2
ทำไมซอมบี้จึงกำลังรอลูกอยู่
ฉันกำลังขุดผ่านแหล่งต่าง ๆ แต่ไม่สามารถหาคำอธิบายที่ดีเกี่ยวกับกายวิภาคของการเลี้ยงเด็กได้ นี่เป็นกรณีง่าย ๆ ของสิ่งที่ฉันต้องการจะเข้าใจ $ cat <( sleep 100 & wait ) & [1] 14247 $ ps ax -O pgid | grep $$ 12126 12126 S pts/17 00:00:00 bash 14248 12126 S pts/17 00:00:00 bash 14249 12126 S pts/17 00:00:00 sleep 100 14251 14250 S pts/17 00:00:00 grep …

1
แสดงความคิดเห็นการใช้งานในฟังก์ชั่นที่ตั้งใจจะใช้แบบโต้ตอบ
ฉันมีฟังก์ชั่นจำนวนมากที่กำหนดไว้ใน.bashrcเจตนาของฉันที่จะใช้แบบโต้ตอบในเทอร์มินัล ฉันมักจะนำหน้าพวกเขาด้วยความคิดเห็นที่อธิบายการใช้งานที่ตั้งใจ: # Usage: foo [bar] # Foo's a bar into a baz foo() { ... } นี่เป็นสิ่งที่ดีถ้าเรียกดูซอร์สโค้ด แต่มันก็ดีที่จะรันtypeในเทอร์มินัลเพื่อรับการแจ้งเตือนอย่างรวดเร็วเกี่ยวกับสิ่งที่ฟังก์ชั่นทำ อย่างไรก็ตามสิ่งนี้ (เข้าใจได้) ไม่รวมความคิดเห็น: $ type foo foo is a function foo () { ... } สิ่งใดที่ทำให้ฉันคิดว่า "จะไม่ดีถ้าความคิดเห็นเหล่านี้ยังคงอยู่เพื่อที่typeจะสามารถแสดงได้" และในจิตวิญญาณของงูหลามของdocstringsฉันมาด้วยนี้ foo() { : Usage: foo [bar] : "Foo's a bar into a baz" …

2
วิธีทำให้ `local` จับรหัสทางออกได้อย่างไร
ในโครงการของฉันฉันมีตัวอย่างต่อไปนี้: local output="$(bash "${1##*/}")" echo "$?" สิ่งนี้จะพิมพ์ค่าศูนย์เนื่องจากการlocalลบlocalจะทำให้$?ตัวแปรทำงานได้อย่างถูกต้อง: ซึ่งจะถือว่ารหัสการออกจาก subshell คำถามของฉันคือ: ฉันจะเก็บตัวแปรนี้ไว้ในตัวเครื่องได้อย่างไรในขณะที่ยังเก็บค่าการออกได้


3
ลบไฟล์ แต่เป็น symlink เท่านั้น
เป็นการดีที่ฉันต้องการคำสั่งเช่นนี้ rm --only-if-symlink link-to-file เพราะฉันเขียนตัวเองหลายครั้งเกินไปการลบไฟล์โดยไม่ได้ตั้งใจแทนที่จะเป็น symlink ที่ชี้ไปที่ไฟล์ สิ่งนี้อาจไม่ดีโดยเฉพาะอย่างยิ่งเมื่อเกี่ยวข้องกับ sudo ตอนนี้ฉันทำแน่นอนls -alเพื่อให้แน่ใจว่ามันเป็น symlink จริง ๆ แต่มันก็มีความเสี่ยงต่อข้อผิดพลาดของผู้ปฏิบัติงาน (ไฟล์ที่มีชื่อคล้ายกันพิมพ์ผิด ฯลฯ ) และสภาพการแข่งขัน (ถ้ามีคนต้องการให้ฉันลบไฟล์ด้วยเหตุผลบางอย่าง) มีวิธีการตรวจสอบว่าไฟล์เป็น symlink และลบมันถ้ามันอยู่ในคำสั่งเดียว?
11 bash  command-line  rm 

1
อย่าใช้โอเปอเรเตอร์ `-a` หรือ` -o 'กับ `['
Stéphane Chazelasเขียนว่า: กฎบางอย่างเช่น อ้างถึงตัวแปรเสมอ ไม่เคยใช้ตัวดำเนินการ-aหรือ-o(ใช้หลาย[คำสั่งและตัวดำเนินการ&&และ||เชลล์) สร้าง[ความน่าเชื่อถือด้วย POSIX shells ทำไม "ไม่เคยใช้-aหรือ-oโอเปอเรเตอร์" ฉันจะ "ใช้[คำสั่งหลายคำสั่งและตัวดำเนินการ&&และ||เชลล์)" ได้อย่างไร
11 bash  shell  test 

2
ฉันจะพิมพ์ค่า ASCII (ตัวเลข) ของอักขระแต่ละตัวในไฟล์ได้อย่างไร
ฉันจะพิมพ์ค่า ASCII ตัวเลขของอักขระแต่ละตัวในไฟล์ข้อความได้อย่างไร กดcatไลค์ แต่แสดงค่า ASCII เท่านั้น ... (ฐานสิบหกหรือทศนิยมเป็นปกติ) ตัวอย่างเอาต์พุตสำหรับไฟล์ที่มีคำว่าApple (ที่มีการป้อนบรรทัด) อาจมีลักษณะดังนี้: 065 112 112 108 101 013 004
11 linux  bash  sed  awk  terminal 

3
ค่าชั่วคราวของสคริปต์ bash ในคำสั่ง
ชอบคำสั่งด้านล่าง if true; then IFS=":" read a b c d e f <<< "$test" หนังสือบอกว่าเมื่อใช้คำสั่งการกำหนดค่า ( IFS ":") ก่อนคำสั่งหลัก ( read a b c d e f <<< "$value") ค่าของมันจะมีผลกับคำสั่งหลักชั่วคราว ดังนั้นการใช้คำสั่งคั่นread: แต่เช่นเดียวกับคำสั่งนี้ if true; then HOME="hello" echo "$HOME" ข้อความสะท้อนไม่ได้เป็นสวัสดี ความหมายที่แท้จริงของคำสั่งข้างต้นคืออะไร?

2
sub-shell เป็นสิ่งเดียวกันกับ child-shell
: มีสองชื่อsubshellและเด็กเปลือก ใช่กระบวนการลูกจะเริ่มจากสิ่งนี้: sh -c 'echo "Hello"' ( echo "hello" ) echo "$(echo "hello") echo "hello" | cat ทุกคนมีความเสมอภาคและใช้ชื่อเดียวกันหรือไม่? ทุกคนแบ่งปันคุณสมบัติเดียวกันหรือไม่ POSIX มีคำจำกัดความนี้ : สภาวะแวดล้อมการประมวลผลเชลล์ประกอบด้วย .... แต่ลิงค์สุดท้ายของย่อหน้าด้านบนมี: สภาพแวดล้อม subshell จะต้องสร้างขึ้นซ้ำกับสภาพแวดล้อมของเชลล์ยกเว้นกับดักสัญญาณที่ไม่ได้ถูกละเว้นจะถูกตั้งค่าเป็นการกระทำเริ่มต้น และพิเศษ: การทดแทนคำสั่งคำสั่งที่จัดกลุ่มด้วยวงเล็บและรายการแบบอะซิงโครนัสจะต้องถูกดำเนินการในสภาพแวดล้อมย่อย นอกจากนี้แต่ละคำสั่งของไปป์ไลน์แบบหลายคำสั่งอยู่ในสภาพแวดล้อม subshell .... sh -c 'echo "Hello"'ไม่ได้รวมอยู่ที่นั่นควรที่จะเรียกว่า subshell ยัง?

2
ไม่สามารถใช้! $ in script?
เพียงแค่สงสัยว่าทำไมสิ่งนี้ถึงไม่ทำงาน #!/bin/bash ls /bin ls !$ ฉันคาดว่าจะทำงานls /binสองครั้ง แต่ข้อผิดพลาดที่สองทำให้เกิดข้อผิดพลาดตามที่!$ไม่ถูกตีความ ฉันพลาดอะไรบางอย่างหรือ!$ทำงานเฉพาะในบรรทัดคำสั่งเท่านั้น ฉันไม่พบส่วนที่เกี่ยวข้องในman bash(บน mac)
11 bash 

2
อะไรคือความแตกต่างระหว่าง & 6 กับ / dev / fd / 6?
หากต้องการอ่านจาก file descriptor 6 ฉันสามารถใช้<&6หรือ</dev/fd/6(aka /proc/self/fd/6) โดยปกติแล้วทั้งสองทำงานได้ดีเท่า ๆ กัน อย่างไรก็ตามหากไฟล์ descriptor นั้นเป็นซ็อกเก็ตสิ่งแปลก ๆ ก็เกิดขึ้น ตัวอย่างเช่น: $ bash -c 'ls -l /dev/fd/6;cat /dev/fd/6' 6</dev/tcp/localhost/12345 lrwx------ 1 michas michas 64 Jan 10 19:50 /dev/fd/6 -> socket:[315010] cat: /dev/fd/6: No such device or address ที่นี่lsแสดงให้เห็นถึง descriptor มีอยู่จริง แต่การเข้าถึงข้อมูลเป็นไปไม่ได้ด้วยวิธีนี้ ถ้าฉันใช้cat <&6แทนทุกอย่างทำงานได้ดีอีกครั้ง อะไรคือความแตกต่างระหว่างทั้งสองวิธีในการเข้าถึงไฟล์ descriptor? มีวิธีที่ดีในการเข้าถึง …

3
วิธีการขยายนามแฝง bash
วิธีสร้างนามแฝงที่ขยายชื่อแทนอีกชื่อหนึ่งใน Bash จริง ๆ ทำไม: ผมเคยได้GREP_OPTIONSตั้งอยู่บน.bashrcบางสิ่งบางอย่างเช่นนี้ GREP_OPTIONS="-I --exclude=\*~" ฉันยังมีสคริปต์ (ให้เราพูดsetup-java.sh) ซึ่งฉันจะโทรก่อนทำงานกับโปรเจ็กต์ Java บางตัว มันจะมีบรรทัด: GREP_OPTIONS="$GREP_OPTIONS --exclude-dir=classes" ถ้าฉันใช้ Sass ด้วยฉันจะโทรหาsetup-sass.shซึ่งมีบรรทัด: GREP_OPTIONS="$GREP_OPTIONS --exclude-dir=\*/.sass-cache" แต่GREP_OPTIONSเลิกใช้แล้วและเห็นได้ชัดว่าโซลูชันมาตรฐานคือสร้างนามแฝงหรือสคริปต์บางอย่าง ...
11 bash  grep  alias 

1
ทุบตีนามแฝงที่มีช่องว่างเป็นส่วนหนึ่งของคำสั่ง
ฉันพยายามที่จะสร้างนามแฝงทุบตีที่ชื่อแทนตัวเองมีช่องว่างในนั้น ความคิดคือนามแฝง (คือcon) sudo openvpn --config /path/to/my/openvpn/configs/ย่อมาจาก ซึ่งส่งผลให้คำสั่งอ่านได้เมื่อใช้conนามแฝง เช่น: `con uk.conf` == `sudo openvpn --config /path/to/my/openvpn/configs/uk.conf` con ="sudo openvpn --config /path/to/my/openvpn/configs/"ฉันเข้าใจว่าฉันไม่สามารถประกาศนามแฝงเช่นนี้ ฟังก์ชั่นทุบตีจะทำงานในสถานการณ์นี้หรือไม่ ฉันไม่เคยได้ยินเรื่องนี้มาก่อน แต่เมื่อค้นคว้าวิธีแก้ปัญหาสำหรับปัญหาเล็กน้อยนี้

1
ทำไมเสียงก้องจับคู่ไฟล์บางไฟล์สองครั้ง?
$ touch file{1..12} $ echo *e{1..12} file1 file2 file3 file4 file5 file6 file7 file8 file9 file10 file11 file12 $ echo *{1..12} file1 file11 file12 file2 file3 file4 file5 file6 file7 file8 file9 file10 file11 file12 ฉันไม่เข้าใจว่าทำไมสิ่งนี้จึงเกิดขึ้น กรุณาช่วยอธิบายหน่อยได้ไหม

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