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

เชลล์เป็นอินเตอร์เฟสบรรทัดคำสั่งของ Unix คุณสามารถพิมพ์คำสั่งในเชลล์แบบโต้ตอบหรือเขียนสคริปต์เพื่อทำงานอัตโนมัติ ใช้แท็กนี้สำหรับคำถามที่ใช้กับ / bin / sh และเชลล์ที่เข้ากันได้มากที่สุด (ash, bash, ksh, zsh, …) สำหรับเชลล์สคริปต์ที่มีข้อผิดพลาดโปรดตรวจสอบใน http://shellcheck.net ก่อนโพสต์ที่นี่


3
ทำไม sh (ไม่ใช่ทุบตี) บ่นเกี่ยวกับฟังก์ชั่นที่กำหนดไว้ใน. bashrc ของฉัน
ฉันได้รับสิ่งนี้เมื่อฉันเปิดเซสชันเทอร์มินัล: sh: ข้อผิดพลาดการนำเข้าคำจำกัดความของฟังก์ชั่นสำหรับ `read.json ' sh: ข้อผิดพลาดการนำเข้าคำจำกัดความของฟังก์ชั่นสำหรับ `ts-project ' sh ไม่ชอบฟังก์ชั่นเหล่านี้เพราะมันดูเหมือน: read.json(){ :: } และ ts-project(){ :: } คำถามที่แท้จริงคือ - ทำไมการshสัมผัส / ตีความไฟล์เหล่านี้? ฉันใช้ MacOS และเห็นสิ่งนี้มาก่อนมันเป็นเรื่องลึกลับ ฉันคิดว่าทุบตีเท่านั้นที่จะโหลดไฟล์เหล่านี้ update : ทุบตีและ sh จะไม่มีอะไรผิดปกติ เมื่อฉันพิมพ์ bash ในเทอร์มินัลฉันได้รับสิ่งนี้: alex$ bash beginning to load .bashrc finished loading .bashrc bash-3.2$ เมื่อฉันพิมพ์shใน terminal ฉันได้รับสิ่งนี้: alex$ sh …

3
ฉันจะสร้างข้อโต้แย้งไปยังคำสั่งอื่นผ่านการทดแทนคำสั่งได้อย่างไร
ติดตามจาก: พฤติกรรมที่ไม่คาดคิดในการทดแทนคำสั่งเชลล์ ฉันมีคำสั่งที่สามารถใช้รายการของการขัดแย้งขนาดใหญ่ซึ่งบางอย่างสามารถมีช่องว่างที่ถูกต้องตามกฎหมาย (และอาจเป็นอย่างอื่น) ฉันเขียนสคริปต์ที่สามารถสร้างข้อโต้แย้งเหล่านั้นสำหรับฉันด้วยเครื่องหมายคำพูด แต่ฉันต้องคัดลอกและวางผลลัพธ์เช่น ./somecommand <output on stdout with quoting> ./othercommand some_args <output from above> ฉันพยายามทำให้เพรียวบางนี้โดยทำ ./othercommand $(./somecommand) และพบพฤติกรรมที่ไม่คาดคิดตามที่กล่าวถึงข้างต้น คำถามคือ - สามารถใช้การทดแทนคำสั่งได้อย่างน่าเชื่อถือในการสร้างอาร์กิวเมนต์เพื่อothercommandให้ข้อโต้แย้งบางอย่างจำเป็นต้องมีการเสนอราคาและสิ่งนี้ไม่สามารถเปลี่ยนแปลงได้?

2
เป็นอันตรายหรือไม่หากใช้เสียงสะท้อน
ฉันเคยเห็นหัวข้อที่คล้ายกันสองสามข้อ แต่พวกเขาอ้างถึงไม่ได้อ้างอิงตัวแปรซึ่งฉันรู้ว่าอาจนำไปสู่ผลลัพธ์ที่ไม่พึงประสงค์ ฉันเห็นรหัสนี้และสงสัยว่าถ้าเป็นไปได้ที่จะฉีดบางสิ่งให้ทำงานเมื่อบรรทัดของรหัสนี้ทำงาน: echo run after_bundle
11 shell  security  quoting  echo 

4
เหตุใดเนื้อหา JSON จาก heredoc จึงไม่สามารถแยกวิเคราะห์ได้
ฉันมีส่วนของ JSON ต่อไปนี้ใช้ไม่ได้: VALUE=<<PERSON { "type": "account", "customer_id": "1234", "customer_email": "jim@gmail.com" } PERSON echo -n "$VALUE" | python -m json.tool ผลลัพธ์คือ: ไม่สามารถถอดรหัสวัตถุ JSON ได้ ทำเช่นเดียวกันกับjqเช่น echo -n "$VALUE" | jq '.' ไม่มีเอาต์พุต มีพฤติกรรมเหมือนกันสำหรับสิ่งต่อไปนี้: VALUE=<<PERSON '{ "type": "account", "customer_id": "1234", "customer_email": "jim@gmail.com" }' PERSON echo -n "$VALUE" | python -m json.tool …

3
รันเชลล์สคริปต์เมื่อ“ / bin / sh” ชี้ไปที่“ / bin / bash”
ฉันได้อ่านสิ่งต่อไปนี้ในคำถามนี้: bash รองรับสวิตช์ --posix ซึ่งทำให้รองรับ POSIX ได้มากขึ้น นอกจากนี้ยังพยายามที่จะเลียนแบบ POSIX ถ้าเรียกว่าเป็นการดวลจุดโทษ อ้างข้างต้นสันนิษฐานว่าคือการเชื่อมโยงที่ชี้ไปยัง/bin/sh/bin/bash แต่ผมไม่เข้าใจสิ่งที่หมายโดย"เรียกว่าเป็นการดวลจุดโทษ" บอกว่าฉันมีสคริปต์ต่อไปนี้ซึ่งเรียกว่า "script.sh": #!/bin/bash echo "Hello World" โปรดบอกฉันในแต่ละกรณีต่อไปนี้ว่าสคริปต์จะทำงานในbashโหมดปกติหรือในโหมด POSIX (สมมติว่าฉันได้ดำเนินการคำสั่งต่อไปนี้ในเทอร์มินัลที่กำลังทำงานอยู่bash): sh script.sh bash script.sh ./script.sh ตอนนี้บอกว่าฉันมีสคริปต์ต่อไปนี้ซึ่งเรียกว่า "script.sh" (ซึ่งเป็นเหมือนสคริปต์ด้านบน แต่ไม่มี Shebang): echo "Hello World" โปรดบอกฉันในแต่ละกรณีต่อไปนี้ว่าสคริปต์จะทำงานในbashโหมดปกติหรือในโหมด POSIX (สมมติว่าฉันได้ดำเนินการคำสั่งต่อไปนี้ในเทอร์มินัลที่กำลังทำงานอยู่bash): sh script2.sh bash script2.sh ./script2.sh
11 linux  bash  shell 

3
อาร์กิวเมนต์บรรทัดคำสั่ง ssh รีโมตรับการวิเคราะห์คำได้อย่างไร
ฉันเห็นคำถามและคำตอบเกี่ยวกับการต้องหลีกเลี่ยงการขัดแย้งกับคำสั่ง ssh จากระยะไกล คำถามของฉันคือ: การแยกวิเคราะห์ครั้งที่สองเสร็จสมบูรณ์เมื่อใดและเมื่อไร ถ้าฉันเรียกใช้ต่อไปนี้: $ ssh otherhost pstree -a -p ฉันเห็นสิ่งต่อไปนี้ในผลลัพธ์: |-sshd,3736 | `-sshd,1102 | `-sshd,1109 | `-pstree,1112 -a -p กระบวนการหลักสำหรับคำสั่งระยะไกล ( pstree) คือsshdไม่ปรากฏว่ามีเปลือกใด ๆ ที่จะแยกวิเคราะห์บรรทัดคำสั่งไปยังคำสั่งระยะไกลดังนั้นมันดูเหมือนว่าจะไม่จำเป็นต้องมีการอ้างถึงหรือหนีสองครั้ง ( แต่มันก็แน่นอน) ถ้าฉันกลับไปที่นั่นก่อนและรับเชลล์ล็อกอินจากนั้นเรียกใช้pstree -a -pฉันจะเห็นสิ่งต่อไปนี้ในผลลัพธ์: ├─sshd,3736 │ └─sshd,3733 │ └─sshd,3735 │ └─bash,3737 │ └─pstree,4130 -a -p เห็นได้ชัดว่ามีbashเชลล์ที่จะทำการแยกบรรทัดคำสั่งในกรณีนั้น แต่ในกรณีที่ฉันใช้คำสั่งระยะไกลโดยตรงดูเหมือนจะไม่เป็นเปลือกดังนั้นทำไมจึงจำเป็นต้องมีการอ้างอิงสองครั้ง
11 bash  shell  ssh  process  quoting 

4
ฉันจะใช้ `find 'เพื่อไปยังไดเรกทอรีของไฟล์นั้นได้อย่างไร
ฉันต้องการค้นหาไฟล์จากนั้นป้อนไดเรกทอรีที่มีไฟล์ ฉันพยายามfind /media/storage -name "Fedora" | xargs cdแต่แน่นอนฉันis not a directoryผิดพลาด ฉันจะป้อนไดเรกทอรีหลักด้วยคำสั่งหนึ่งบรรทัดได้อย่างไร
11 shell  find  xargs  cd-command 

1
มีวิธีที่สวยงามในการตั้งค่าตัวแปรเชลล์ให้กับเนื้อหาของไฟล์หรือไม่?
configว่าฉันมีข้อมูลการกำหนดค่าบางอย่างในแฟ้ม ฉันต้องการโหลดข้อมูลนี้ลงในตัวแปรเชลล์เพื่อความCONFIG_DATAสะดวก เห็นได้ชัดว่าฉันสามารถทำ: CONFIG_DATA="$(cat config)" แต่ความรู้สึกแบบนี้ไม่มีประโยชน์catกับฉัน นี่เป็นวิธีเดียวที่จะทำเช่นนี้? หรือมีวิธีที่สง่างามกว่าที่จะทำหรือไม่ รู้รอบควรเลือก POSIX แต่อาจใช้เชลล์ใดก็ได้

4
วิธีการกำหนดระยะเวลาที่เหลือใน“ การนอนหลับ”?
ฉันมี: sleep 210m && for i in $(seq 1 5); do echo -e '\a'; sleep 0.5; done ทำงานเป็นตัวจับเวลาแบบเรียบง่ายไม่สะดุดเพื่อเตือนฉันเมื่อมีบางสิ่งที่ควรทำ นั่นsleep 210mคือ PID 25347 ฉันพยายามที่จะคิดออกว่าเวลาที่เหลืออยู่ในการนอนหลับ สิ่งที่ดีที่สุดที่ฉันจะได้รับด้วยการนอนในระยะเวลาเดิม (210 นาที) คือ: $ echo "210 60 * $(ps -o etimes= 25347) - 60 ~ r n [:] P p" | dc 78:11 (คำอธิบาย: บิตแรกคำนวณจำนวนวินาทีในโหมดสลีปดั้งเดิม $(ps…)บิตจะได้รับเวลานับตั้งแต่โหมดสลีปเริ่มต้นในไม่กี่วินาทีจากนั้นส่วนที่เหลือจะลบออกและแสดงในนาทีและวินาที) …
11 shell  sleep 

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

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 ยัง?

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 ฉันไม่เข้าใจว่าทำไมสิ่งนี้จึงเกิดขึ้น กรุณาช่วยอธิบายหน่อยได้ไหม

5
Bash - PS1 ไม่อัปเดตด้วยชื่อโฮสต์ที่เหมาะสมหลังจากเปลี่ยนชื่อโฮสต์ในสคริปต์
นี่เป็นสำเนาโพสต์ของฉันจาก stackoverflow ฉันรู้ว่าฉันควรถามที่นี่ ... ฉันต้องการเรียกใช้สคริปต์ที่เปลี่ยนชื่อโฮสต์และอัพเดต bash prompt (ตัวแปร PS1) ของฉันทันทีด้วยชื่อโฮสต์ที่เหมาะสม ฉันจะทำให้สิ่งนี้เกิดขึ้นได้อย่างไร ฉันเรียกใช้สิ่งนี้ #!/bin/bash # Usage: ./changehost <newhostname> #Do two sed's to edit the files for persistent hostname change sed -i s/$(hostname)/$1/g "/etc/hosts" sed -i s/$(hostname)/$1/g "/etc/sysconfig/network" #run the hostname command with new hostname to update it hostname $1 ในเทอร์มินัลอย่างนั้นและรับสิ่งนี้ [user@host …
11 bash  shell 

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