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

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

7
ฉันจะแทรกช่องว่างทุกสี่อักขระในบรรทัดยาวได้อย่างไร
ฉันมีเส้นยาวที่ฉันต้องการแทรกช่องว่างทุก ๆ 4 ตัวอักษรในข้อความทึบเส้นเดียวเพื่อให้อ่านง่ายขึ้นวิธีที่ง่ายที่สุดในการทำเช่นนี้คืออะไร? นอกจากนี้ฉันควรจะสามารถป้อนบรรทัดจากท่อ เช่น echo "foobarbazblargblurg" | <some command here> จะช่วยให้ foob arba zbla rgbl urg

4
การอ้างถึง ssh $ host $ FOO และ ssh $ host“ sudo su user -c $ FOO”
ฉันมักจะจบลงด้วยการออกคำสั่งที่ซับซ้อนมากกว่า ssh; คำสั่งเหล่านี้เกี่ยวข้องกับ piping to awk หรือ perl one-line และด้วยเหตุนี้จึงมีการเสนอราคาเดียวและ $ 's ฉันไม่สามารถคิดออกกฎอย่างหนักและรวดเร็วในการอ้างอิงได้อย่างถูกต้องและไม่พบการอ้างอิงที่ดีสำหรับมัน ตัวอย่างเช่นพิจารณาสิ่งต่อไปนี้: # what I'd run locally: CMD='pgrep -fl java | grep -i datanode | awk '{print $1}' # this works with ssh $host "$CMD": CMD='pgrep -fl java | grep -i datanode | awk '"'"'{print $1}'"'" (สังเกตเครื่องหมายอัญประกาศพิเศษในคำสั่ง awk) …
30 bash  shell  ssh  quoting 

2
อธิบายคำสั่งเชลล์: shift $ (($ optind - 1))
ฉันไม่ได้เป็นผู้ชาย Linux แต่ติดอยู่ในสคริปต์บางอย่างที่ฉันต้องอ่านสำหรับโครงการของฉัน ดังนั้นทุกคนสามารถช่วยฉันในสิ่งที่คำสั่งนี้กำลังทำอะไรอยู่? shift $(($optind - 1))

6
จะใช้คำสั่ง shell เพื่อแสดงเฉพาะคอลัมน์แรกและคอลัมน์สุดท้ายในไฟล์ข้อความได้อย่างไร
ฉันต้องการความช่วยเหลือในการหาวิธีใช้คำสั่ง sed เพื่อแสดงเฉพาะคอลัมน์แรกและคอลัมน์สุดท้ายในไฟล์ข้อความ นี่คือสิ่งที่ฉันมีจนถึงคอลัมน์ 1: cat logfile | sed 's/\|/ /'|awk '{print $1}' ความพยายามที่อ่อนแอของฉันในการทำให้คอลัมน์สุดท้ายแสดงเช่นกันคือ: cat logfile | sed 's/\|/ /'|awk '{print $1}{print $8}' อย่างไรก็ตามการดำเนินการนี้จะใช้คอลัมน์แรกและคอลัมน์สุดท้ายแล้วรวมเข้าด้วยกันในรายการเดียว มีวิธีพิมพ์คอลัมน์แรกและคอลัมน์สุดท้ายอย่างชัดเจนด้วยคำสั่ง sed และ awk หรือไม่? ตัวอย่างอินพุต: foo|dog|cat|mouse|lion|ox|tiger|bar
30 shell  sed  awk 

3
ถ้าฉัน sudo เรียกใช้ไฟล์สคริปต์ Bash คำสั่งทั้งหมดภายในสคริปต์ Bash จะถูกเรียกใช้งานเป็น sudo ด้วยหรือไม่
ฉันต้องการเขียนสคริปต์หลังการติดตั้งอัตโนมัติใน Bash ( post-install.shเช่นชื่อ) สคริปต์จะเพิ่มและอัปเดตที่เก็บติดตั้งและอัพเดทแพ็คเกจโดยอัตโนมัติแก้ไขไฟล์กำหนดค่า ฯลฯ ตอนนี้ถ้าฉันรันสคริปต์นี้เช่นsudo post-install.shฉันจะได้รับแจ้งให้ป้อนsudoรหัสผ่านครั้งเดียวเท่านั้นหรือฉันจะต้องป้อนsudoรหัสผ่านในแต่ละการเรียกใช้คำสั่งภายในสคริปต์ซึ่งต้องsudoได้รับอนุญาตหรือไม่ กล่าวอีกนัยหนึ่งคำสั่งภายในสคริปต์ทุบตี 'สืบทอด' สิทธิ์การดำเนินการดังนั้นจะพูดหรือไม่ และถ้าพวกเขาทำจริง ๆแล้วยังมีความเป็นไปได้ไหมที่sudoสิทธิ์จะหมดเวลา (ตัวอย่างเช่นคำสั่งเฉพาะใช้เวลานานพอที่จะsudoหมดเวลา) หรือการป้อนsudoรหัสผ่านครั้งแรกจะมีอายุการใช้งานตลอดช่วงเวลาของสคริปต์ทั้งหมดหรือไม่

4
ทำไมชุด -e ไม่ทำงานภายใน subshells ด้วยวงเล็บ () ตามด้วย OR list ||?
ฉันใช้สคริปต์บางอย่างเช่นนี้เมื่อเร็ว ๆ นี้: ( set -e ; do-stuff; do-more-stuff; ) || echo failed นี่ดูดีสำหรับฉัน แต่มันใช้งานไม่ได้! ใช้ไม่ได้เมื่อคุณเพิ่มset -e ||หากปราศจากอย่างนั้นก็ใช้งานได้ดี: $ ( set -e; false; echo passed; ); echo $? 1 อย่างไรก็ตามหากฉันเพิ่มสิ่ง||นั้นset -eจะถูกละเว้น: $ ( set -e; false; echo passed; ) || echo failed passed การใช้เปลือกแยกที่แท้จริงจะทำงานตามที่คาดไว้: $ sh -c 'set -e; false; …

6
ออกจากเชลล์สคริปต์จากเชลล์ย่อย
ลองพิจารณาตัวอย่างนี้: stop () { echo "${1}" 1>&2 exit 1 } func () { if false; then echo "foo" else stop "something went wrong" fi } โดยปกติเมื่อfuncถูกเรียกมันจะทำให้สคริปต์หยุดทำงานซึ่งเป็นพฤติกรรมที่ตั้งใจไว้ อย่างไรก็ตามถ้ามันถูกดำเนินการใน sub-shell เช่น in result=`func` มันจะไม่ออกจากสคริปต์ ซึ่งหมายความว่ารหัสการโทรต้องตรวจสอบสถานะการออกของฟังก์ชั่นทุกครั้ง มีวิธีหลีกเลี่ยงสิ่งนี้หรือไม่? สิ่งนี้set -eมีไว้เพื่ออะไร?

7
ฉันควรใช้เชลล์ตัวใด - tcsh vs bash? [ปิด]
ฉันใช้tcshงานมานานแล้ว แต่เมื่อใดก็ตามที่ฉันกำลังค้นหาบางอย่างฉันมักพบว่าวิธีการที่ระบุนั้นbashเฉพาะเจาะจง แม้แต่ไวยากรณ์สำหรับเชลล์สคริปต์ก็ยังแตกต่างกันสำหรับทั้งสอง จากสิ่งที่ฉันมีประสบการณ์การค้นหาและการเรียนรู้บนอินเทอร์เน็ตbashดูเหมือนจะเป็นเปลือกที่ใช้บ่อยขึ้น แม้จำนวนของคำถามในเว็บไซต์นี้มีแท็กbashเป็นวิธีที่มากขึ้น (ห้าครั้งในขณะนี้) tcshกว่าจำนวนของคำถามที่ถูกแท็ก ดังนั้นฉันสงสัยว่าฉันควรเปลี่ยนเป็นทุบตี คุณคิดอย่างไร? ทำไมฉันถึงติดtcshหรือทำไมฉันจึงควรย้ายไปที่bash?
30 linux  shell  bash  fedora  tcsh 


4
ฉันจะแสดงแผนผังกระบวนการของเทอร์มินัลเชลล์รวมถึงลูก ๆ ได้อย่างไร
เมื่อสคริปต์ถูกเรียกใช้จากพรอมต์คำสั่งเชลล์จะวางไข่ subprocess สำหรับสคริปต์นั้น ฉันต้องการแสดงความสัมพันธ์ระหว่างกระบวนการระดับเทอร์มินัลและลูก ๆ ของมันที่ใช้psในการแสดงผลแบบต้นไม้ ฉันจะทำสิ่งนี้ได้อย่างไร สิ่งที่ฉันได้ลองมาแล้ว ไฟล์: script.sh #!/bin/bash ps -f -p$1 จากนั้นฉันจะเรียกใช้สคริปต์จากบรรทัดคำสั่งที่ส่งผ่านใน id กระบวนการของเทอร์มินัลเชลล์: $ ./script.sh $$ สิ่งที่ฉันต้องการคืออะไรแบบนี้ กระบวนการเชลล์ระดับบนสุด (เทอร์มินัล) ./script.sh กระบวนการสำหรับpsคำสั่งเอง USER PID [..] ubuntu 123 -bash ubuntu 1234 \_ bash ./script.sh ubuntu 12345 \_ ps auxf สิ่งที่ฉันได้รับคือ: PID TTY STAT TIME COMMAND 14492 pts/24 Ss …
30 shell  ps 

2
ตัวแยกทศนิยมปัจจุบันคืออะไร
บอกว่าฉันมีสคริปต์เชลล์ POSIX ที่ ต้องทำงานในระบบ / สภาพแวดล้อมที่แตกต่างกันซึ่งฉันไม่ได้ควบคุมและ จำเป็นต้องลบตัวแยกทศนิยมออกจากสตริงที่ปล่อยโดยโปรแกรมที่เคารพการตั้งค่าภาษา ฉันจะตรวจจับตัวแยกทศนิยมด้วยวิธีทั่วไปได้อย่างไร

1
เหตุใดการแทนที่กระบวนการ BASH จึงไม่ทำงานกับคำสั่งบางอย่าง
ในบางโอกาสการทดแทนกระบวนการจะไม่ทำงานตามที่คาดไว้ นี่คือตัวอย่าง: การป้อนข้อมูล: gcc <(echo 'int main(){return 0;}') เอาท์พุท: /dev/fd/63: file not recognized: Illegal seek collect2: error: ld returned 1 exit status การป้อนข้อมูล: แต่มันทำงานได้อย่างที่คาดไว้เมื่อใช้กับคำสั่งอื่น: grep main <(echo 'int main(){return 0;}') เอาท์พุท: int main(){return 0;} ฉันได้สังเกตเห็นความล้มเหลวที่คล้ายกันกับคำสั่งอื่น ๆ (เช่นคำสั่งคาดหวังว่าไฟล์จากการทดแทนกระบวนการไม่สามารถใช้/dev/fd/63หรือคล้ายกัน) ความล้มเหลวด้วยgccนี้เป็นเพียงล่าสุด มีกฎทั่วไปบางอย่างที่ฉันควรทราบเพื่อกำหนดว่าเมื่อใดการทดแทนกระบวนการจะล้มเหลวด้วยวิธีนี้และไม่ควรใช้? ฉันใช้ BASH รุ่นนี้บน Ubuntu 12.04 (ฉันเคยเห็นใน arch และ debian): GNU bash, …

3
เปลี่ยนเป็นพาเรนต์เชลล์โดยไม่ต้องออกจากระบบ
สมมติว่าฉันเริ่มต้นในบัญชีท้องถิ่นของฉัน: avindra@host:~> จากนั้นฉันเปลี่ยนเป็นรูท: host:~ # จากนั้นฉันสลับไปที่ oracle: [ oracle@host:~] มีวิธีให้ฉันย้อนกลับไปที่รูทเชลล์ (พาเรนต์) โดยไม่ต้องออกจาก oracle shell หรือไม่? มันจะสะดวกในกรณีนี้เพราะบัญชี oracle ไม่มีสิทธิ์ sudo ตัวอย่างเช่นฉันอยู่ใน / some / จริงๆ / deep / nested / directory ใน oracle และฉันมีการตั้งค่าตัวแปรสภาพแวดล้อมพิเศษทุกชนิด แต่ฉันต้องกลับไปที่รูทเพื่อสัมผัสไฟล์ระบบ ขณะนี้ฉันจะเลื่อนออกจาก oracle shell เพื่อกลับไปรูทรันคำสั่งรูทของฉันจากนั้นเปลี่ยนกลับเป็น Oracle ความไม่สะดวกคือฉันเข้าสู่ระบบตั้งแต่เริ่มต้นใหม่และสูญเสียไดเรกทอรีการทำงานและสภาพแวดล้อม ที่ถูกกล่าวว่ามีวิธีที่จะทำสิ่งที่ฉันถาม?
29 shell 

5
วิธีการใส่อักขระพิเศษบรรทัดใหม่ลงในไฟล์โดยใช้คำสั่ง echo และโอเปอเรเตอร์การเปลี่ยนเส้นทาง
ฉันต้องการสร้างไฟล์โดยใช้คำสั่ง echo และโอเปอเรเตอร์การเปลี่ยนเส้นทางไฟล์ควรสร้างขึ้นมาไม่กี่บรรทัด ฉันพยายามใส่ newline ด้วย "\ n" ในสตริง: echo "first line\nsecond line\nthirdline\n" > foo แต่ด้วยวิธีนี้จะไม่มีการสร้างไฟล์ที่มีสามบรรทัด แต่เป็นไฟล์ที่มีเพียงหนึ่งบรรทัดและเนื้อหาคำต่อคำของสตริง ฉันจะสร้างโดยใช้คำสั่งนี้เฉพาะไฟล์ที่มีหลายบรรทัดได้อย่างไร?


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