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

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

3
ความแตกต่างระหว่างคำสั่ง pbrun และ sudo คืออะไร?
ความแตกต่างระหว่างคำสั่งpbrunและsudoคืออะไร? ฉันเคยเห็นคนที่ดำเนินการ pbrun sudo su - สิ่งนี้หมายความว่าอย่างไร ฉันรู้ว่า su - มันจะพยายามเปลี่ยนไปใช้ผู้ใช้รูท pbrun พิเศษอะไรที่มอบให้กับ sudo เมื่อมันถูกใช้พร้อมกับคำสั่ง sudo?

2
เรียกใช้คำสั่งอื่นก่อนเรียกใช้คำสั่งที่ผู้ใช้ต้องการเรียกใช้
สมมติว่าฉันต้องการแก้ไขพฤติกรรมดั้งเดิมของlsเครื่องมือด้วยวิธีนี้: $ ls Hello World file1 file2 ... ฉันจะทำสิ่งนี้ได้อย่างไร เมื่อเรียกใช้ผมอยากจะเรียกใช้คำสั่งอื่นพูดให้ของlsecho "Hello World!" วิธีแก้ปัญหาอย่างรวดเร็วที่ฉันเห็นใช้นามแฝง: alias orig_ls="ls" alias ls='echo "Hello World!"' แต่นี้ไม่ได้เป็นทางออกที่แท้จริงตั้งแต่เมื่อฉันจะทำงานมันจะเอาท์พุทorig_ls"Hello World!"

2
หากกระบวนการลูกที่เกิดใหม่ล้มเหลวให้ฆ่าทั้งหมดและออก
ในสคริปต์ของฉันฉันแบ่งชุดข้อมูลเป็น input_aa, input_ab และอื่น ๆ จากนั้นฉันเรียกใช้แต่ละสคริปต์ Python เดียวกันเช่น: # Execute program on each split file for part in input_*; do python3 $part & done wait คำถามของฉันคือสองเท่า: ฉันจะตรวจสอบได้อย่างไรว่ากระบวนการ Python ล้มเหลวและเมื่อตรวจพบฉันจะฆ่าเด็กที่เกิดมาแล้วทั้งหมดและออกจากสคริปต์ได้อย่างไร
9 bash  shell  python 

1
ksh93 เร็วแค่ไหน?
โดยทั่วไปแล้วฉันมักจะมองหาการsedประมวลผลข้อความ - โดยเฉพาะอย่างยิ่งสำหรับไฟล์ขนาดใหญ่ - และมักจะหลีกเลี่ยงการทำสิ่งต่าง ๆ เหล่านั้นในเชลล์เอง แต่ฉันคิดว่ามันอาจเปลี่ยนไป ฉันแหย่ไปรอบ ๆman kshและฉันสังเกตเห็นสิ่งนี้: <#pattern Seeks forward to the beginning of the next line containing pattern. <##pattern The same as <# except that the por‐ tion of the file that is skipped is copied to standard output. ฉันสงสัยว่ามันมีประโยชน์ในโลกแห่งความเป็นจริงฉันจึงลองทำดู ฉันทำ: seq -s'foo bar ' …

2
ฉันจะผ่านการ subshell ผ่าน 'time' แบบมีเงื่อนไขได้อย่างไร
timeฉันมีสคริปต์การติดตั้งสำหรับกล่องจรจัดที่ผมใช้ในการวัดขั้นตอนเดียวกับ ตอนนี้ฉันต้องการเปิดหรือปิดใช้งานการวัดเวลาแบบมีเงื่อนไข ตัวอย่างเช่นก่อนหน้านี้บรรทัดจะมีลักษณะดังนี้: time (apt-get update > /tmp/last.log 2>&1) ตอนนี้ฉันคิดว่าฉันสามารถทำสิ่งนี้ได้ง่ายๆ: MEASURE_TIME=true [[ $MEASURE_TIME = true ]] && TIME="time --format=%e" || TIME="" $TIME (apt-get update > /tmp/last.log 2>&1) แต่สิ่งนี้จะไม่ทำงาน: syntax error near unexpected token `apt-get' `$TIME (apt-get update > /tmp/last.log 2>&1)' มีปัญหาอะไรที่นี่
9 bash  shell  quoting  time 

5
ฉันขอเกี่ยวกับคำสั่ง cd ได้หรือไม่
ฉันพยายามตั้งค่าบางอย่างบนเซิร์ฟเวอร์ที่ฉันเรียกใช้เมื่อฉันcdเข้าไปในpublic_htmlโฟลเดอร์ 95% ของเวลามีคำสั่งเล็กน้อยที่ฉันจะเรียกใช้เพื่อตรวจสอบบางสิ่งอยู่เสมอ มีอยู่แล้วฉันสามารถขอเป็นcdดังนั้นถ้าไดเรกทอรีเป็นpublic_htmlมันจะทำงานโดยอัตโนมัติคำสั่งสำหรับฉัน หากฉันไม่สามารถขอcdคำสั่งได้มีสิ่งอื่นอีกไหมที่ฉันสามารถทำได้เพื่อให้ได้ผลลัพธ์ตามที่ฉันต้องการ ฉันใช้ CentOS 5.8

2
ลำดับความสำคัญของ && vs & ใน bash และ zsh
ตอบคำถามนี้ฉันค้นพบความแตกต่างที่ตลกมาก (และบอบบาง) ระหว่างพฤติกรรมในbashและzsh: ในbash: romano@RRyS:~$ pwd /home/romano romano@RRyS:~$ alias x="cd /bin && ./echo A >/dev/null &" romano@RRyS:~$ x [1] 16611 romano@RRyS:~$ pwd /home/romano อย่างที่คุณเห็นการดำเนินการของนามแฝงxจะดำเนินการใน subshell ดังนั้นไดเรกทอรีปัจจุบันจะไม่เปลี่ยนแปลง ไม่อยู่ในzsh: [romano:~] % pwd /home/romano [romano:~] % alias x="cd /bin && ./echo A >/dev/null &" [romano:~] % x [1] 16744 [1] + 16744 done …
9 bash  shell  zsh 

4
EOF ที่ไม่คาดคิดและข้อผิดพลาดทางไวยากรณ์
ขณะนี้ฉันกำลังเขียนเชลล์สคริปต์ตัวที่สามของฉันและฉันพบปัญหา นี่คือสคริปต์ของฉัน: #!/bin/bash echo "choose one of the following options : \ 1) display all current users \ 2) list all files \ 3) show calendar \ 4) exit script" while read do case in 1) who;; 2) ls -a;; 3) cal;; 4) exit;; esac done เมื่อฉันพยายามเรียกใช้สคริปต์ข้อความนี้จะบอกว่า: line2 : unexpected …

2
เป็นไปได้ไหมที่จะใช้ตัวแปรพารามิเตอร์เชลล์ ($ 1, …, $ @) โดยตรงใน CLI
บางครั้งมีความจำเป็นต้องจำลองและตรวจสอบตัวแปรข้างต้นในตัวอย่างเล็ก ๆ จากนั้นสามารถคัดลอกไปยังสคริปต์บางรายการได้ทันที ฉันพยายามที่จะแก้ปัญหาโดยใช้ตัวอย่างง่ายๆด้วยวิธีต่อไปนี้: (find $1) /tmp sh -c '(find $1) /tmp' sh -c "find $1" /tmp echo '(find $1) /tmp' | sh และด้วยชุดค่าผสมอื่น ๆ ทดลองโดยการเพิ่มคำสั่งล่าม shebang #!/bin/sh -xแต่ไม่ได้ผลลัพธ์ที่ต้องการ ฉันสามารถทำสิ่งนี้ได้ง่ายๆ

3
ตัดความกว้างบรรทัด stdout แบบไดนามิกใน Bash
เมื่อเร็ว ๆ นี้ฉันได้ทดลองกับpsคำสั่งและบางครั้งเส้นทางที่ยาวพันไปยังบรรทัดถัดไป (หรือสอง) และทำให้อ่านยาก ฉันต้องการไพพ์psเอาต์พุตในโปรแกรมอื่นเพื่อ จำกัด เอาต์พุตเป็นxจำนวนอักขระ นี่คือสิ่งที่ฉันมีจนถึงตอนนี้ แต่มันใช้งานไม่ได้: ps aux | cut -c1-$(stty size | cut -d' ' -f2) $(stty size | cut -d' ' -f2)ประเมินถึง 167 cutแต่ไม่ได้ดูเหมือนจะมีการป้อนข้อมูลที่ถูกต้องสำหรับ มีวิธีรับไวยากรณ์ประเภทนี้ทำงานในทุบตี?
9 bash  shell  stdout  cut 

4
วิธีอ่านอินพุตของผู้ใช้จากไปป์?
สมมติว่าฉันมีไฟล์ชื่อที่confirmation.shมีเนื้อหาดังต่อไปนี้: #!/bin/bash echo -n "Are you sure [Y/n]? " read line case "$line" in n|N) echo "smth" ;; y|Y) echo "smth" ;; esac และฉันต้องการเรียกใช้สคริปต์นี้ด้วยวิธีต่อไปนี้: cat confirmation.sh | sh ฉันเห็นAre you sure [Y/n]?และสคริปต์ถูกขัดจังหวะ มีปัญหาอะไร?

1
เหตุผลสำหรับเปลือกทุบตีไม่เตือนคุณเกี่ยวกับการคำนวณทางคณิตศาสตร์ล้น ฯลฯ คืออะไร?
มีขีด จำกัด สำหรับความสามารถในการประเมินผลทางคณิตศาสตร์ของbashเชลล์ คู่มือฉบับย่อเกี่ยวกับแง่มุมของเชลล์ทางคณิตศาสตร์นี้ แต่ระบุว่า : การประเมินจะทำในจำนวนเต็มที่มีความกว้างคงที่โดยไม่มีการตรวจสอบการล้น แต่การหารด้วย 0 จะถูกดักและตั้งค่าสถานะเป็นข้อผิดพลาด โอเปอเรเตอร์และลำดับความสำคัญการเชื่อมโยงและค่าต่าง ๆ นั้นเหมือนกับในภาษา C จำนวนเต็มที่มีความกว้างคงที่ซึ่งหมายถึงนี้เป็นจริงเกี่ยวกับชนิดข้อมูลที่ใช้ (และเฉพาะของสาเหตุนี้เกินกว่านี้) แต่ค่าขีด จำกัด จะแสดง/usr/include/limits.hในแบบนี้: # if __WORDSIZE == 64 # define ULONG_MAX 18446744073709551615UL # ifdef __USE_ISOC99 # define LLONG_MAX 9223372036854775807LL # define ULLONG_MAX 18446744073709551615ULL และเมื่อคุณรู้ว่าคุณสามารถยืนยันสถานะของความจริงเช่นนี้: # getconf -a | grep 'long' LONG_BIT 64 ULONG_MAX 18446744073709551615 …

2
ฆ่าโพรเซสถ้ามันเงียบไปชั่วระยะเวลาหนึ่ง
ฉันมียูทิลิตี้ที่มีนิสัยที่น่ารังเกียจที่จะเงียบและอยู่ที่นั่นฉันรู้แล้วว่ามันใช้เวลานานแค่ไหนในการทำสิ่งนี้ดังนั้นฉันจึงใช้timeoutเพื่อต่อสู้กับสิ่งนี้ แต่บางครั้งมันก็ทำก่อนเวลานั้น มีเครื่องมือที่คล้ายกับtimeoutที่จะฆ่ากระบวนการถ้ามันหยุดกำกับการส่งออกไปยัง stdout?
9 linux  bash  shell  stdout  timeout 


1
วิธีผสานสองไฟล์ในแถวที่สอดคล้องกันได้อย่างไร
ตอนนี้ฉันมีสองไฟล์: aaaa.txt: a=0; b=1; c=2; bbbb.txt: d=3 e=4 f=5 ฉันต้องการที่จะผสานaaaa.txtและการbbbb.txtcccc.txt cccc.txt ดังต่อไปนี้: a=0;d=3 b=1;e=4 c=2;f=5 ดังนั้นฉันจะทำอะไรได้บ้าง

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