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

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


4
ขอบเขตของตัวแปรท้องถิ่นในฟังก์ชั่นเชลล์
หลังจากอ่าน24.2 ตัวแปรท้องถิ่นผมคิดว่าการประกาศตัวแปรvarด้วยคำหลักlocalนั่นหมายความว่าvarค่า 's สามารถเข้าถึงได้เฉพาะภายในบล็อกของรหัสที่คั่นด้วยวงเล็บปีกกาของฟังก์ชั่น อย่างไรก็ตามหลังจากรันตัวอย่างต่อไปนี้ฉันพบว่าvarสามารถเข้าถึงได้อ่านและเขียนจากฟังก์ชั่นที่เรียกใช้โดยบล็อกของรหัสนั้น - เช่นแม้ว่าจะvarถูกประกาศlocalไปouterFuncแล้วinnerFuncก็ยังสามารถอ่านและแก้ไขค่าได้ Run It Online #!/usr/bin/env bash function innerFunc() { var='new value' echo "innerFunc: [var:${var}]" } function outerFunc() { local var='initial value' echo "outerFunc: before innerFunc: [var:${var}]" innerFunc echo "outerFunc: after innerFunc: [var:${var}]" } echo "global: before outerFunc: [var:${var}]" outerFunc echo "global: after outerFunc: [var:${var}]" …

4
สคริปต์ทุบตีตรวจพบได้อย่างไรว่าสคริปต์นั้นทำงานในพื้นหลัง
มีวิธีที่สคริปต์ทุบตีจะรู้ว่ามันทำงานในเบื้องหน้าหรือพื้นหลังและเพื่อให้สามารถทำงานแตกต่างกันเล็กน้อยในแต่ละกรณี?
28 bash  shell 

9
การลบไดเรกทอรีจาก PATH
ฉันพยายามรวบรวม wxWidgets โดยใช้ MingW และฉันมี cygwin ในเส้นทางของฉันซึ่งดูเหมือนว่าจะขัดแย้งกัน ดังนั้นฉันต้องการลบออก/d/Programme/cygwin/binจากตัวแปร PATH และฉันสงสัยว่ามีวิธีที่สง่างามในการทำเช่นนี้หรือไม่ วิธีการที่ไร้เดียงสาจะสะท้อนไปยังไฟล์ลบออกด้วยตัวเองและส่งมัน แต่ฉันคิดว่ามันมีวิธีการที่ดีกว่า

4
จะทำ 'wc -l' อย่างต่อเนื่องกับ gnu texttools ได้อย่างไร?
ฉันรู้แน่นอนว่า cat logfile.txt | wc -l 120 จะบอกจำนวนบรรทัดในไฟล์ให้ฉัน แต่ทว่า tail -f logfile.txt จะแสดงบรรทัดใหม่ที่โปรแกรมอื่นเขียนถึงlogfile.txtฉัน เป็นไปได้หรือไม่ที่จะรวมทั้งสองอย่างเพื่อให้ฉันได้รับการนับจำนวนบรรทัดใหม่อย่างต่อเนื่องของ logfile.txt ด้วยยูทิลิตี้ข้อความมาตรฐาน? ฉันรู้เกี่ยวกับ watch wc -l logfile.txt แต่ฉันไม่ต้องการนับไฟล์ใหม่ทุกครั้งที่ดูเหมือนว่าจะเป็นการสิ้นเปลือง หนึ่งจะต้องมีการผนวกเพียงนับทุกวินาทีหรือมากกว่านั้นและอาจจะ\rแทนที่จะเป็น\nในตอนท้ายของบรรทัด

1
เหตุใดไฟล์ echo> ใช้เวลาจริงมากกว่า echo | sed> file?
ตัวอย่างด้านล่างทำให้ฉันประหลาดใจ ดูเหมือนว่าจะตอบโต้ได้ง่าย ... นอกเหนือจากความจริงที่ว่ามีเวลาผู้ใช้มากขึ้นสำหรับecho | sedคอมโบ เหตุใดจึงechoใช้เวลามากเมื่อทำงานเพียงอย่างเดียวหรือคำถามควรsedเปลี่ยนสถานะการเล่นอย่างไร ดูเหมือนว่าechoจะต้องทำเสียงสะท้อนที่เหมือนกันในทั้งสองกรณี ... time echo -n a\ {1..1000000}\ c$'\n' >file # real 0m9.481s # user 0m5.304s # sys 0m4.172s time echo -n a\ {1..1000000}\ c$'\n' |sed s/^\ // >file # real 0m5.955s # user 0m5.488s # sys 0m1.580s
28 bash  shell  pipe  time  echo 

6
การใช้ปุ่ม VI เพื่อแก้ไขคำสั่งเชลล์ใน UNIX
ฉันเคยมีเพื่อนร่วมงานซึ่งเก่งเรื่องยูนิกซ์จริงๆ เขาแสดงให้ฉันเห็นวิธีใช้การเชื่อมโยงคีย์ Vi เพื่อแก้ไขคำสั่งเชลล์ของฉัน เขาวางคำสั่งไว้ในไฟล์ที่รันทุกครั้งที่ฉันเข้าสู่ระบบ ตั้งแต่นั้นมาฉันย้ายไปที่โครงการอื่น น่าเสียดายที่ฉันจำวิธีตั้งค่านี้ไม่ได้ มีใครบ้างที่รู้วิธีใช้การเชื่อมโยงคีย์ Vi เพื่อแก้ไขคำสั่งในเทอร์มินัลหรือไม่ ฉันจะทำให้การตั้งค่านั้นเป็นแบบถาวรได้อย่างไร
28 shell  vim  terminal  vi 

3
จะเปลี่ยน PATH ภายในเชลล์สคริปต์ได้อย่างไร?
ฉันมีหลายโครงการที่ต้องการให้ฉันเปลี่ยนรุ่น Java / Grails / Maven ฉันพยายามจัดการกับสคริปต์บางอย่างที่จะทำให้การเปลี่ยนแปลง ตัวอย่างเช่น: #!/bin/sh export JAVA_HOME=/cygdrive/c/dev/Java/jdk1.5.0_22 export PATH=$JAVA_HOME/bin:$PATH export GRAILS_HOME=/cygdrive/c/dev/grails-1.0.3 export PATH=$GRAILS_HOME/bin:$PATH export MAVEN_HOME=/cygdrive/c/dev/apache-maven-2.0.11 export PATH=$MAVEN_HOME/bin:$PATH which java which grails which mvn เมื่อสิ่งนี้ดำเนินการมันจะเปลี่ยน PATH ภายในบริบทของสคริปต์ แต่จากนั้นสคริปต์จะสิ้นสุดและไม่มีการเปลี่ยนแปลงใด ๆ ฉันจะรันสคริปต์เพื่อเปลี่ยน PATH ในเชลล์ที่ฉันใช้งานอยู่ได้อย่างไร ฉันใช้ Cygwin

8
grep และหาง -f
เป็นไปได้ที่จะทำtail -f(หรือคล้ายกัน) ในไฟล์และgrepในเวลาเดียวกัน? ฉันจะไม่รังเกียจคำสั่งอื่น ๆ เพียงแค่มองหาพฤติกรรมแบบนั้น

3
แยกไฟล์ทีละบรรทัดและควบคุมส่วนขยายของไฟล์ที่ได้
มีคำสั่งมาตรฐานสำหรับการแยกไฟล์ - แยก ตัวอย่างเช่นหากฉันต้องการแยกไฟล์คำในหลาย ๆ บรรทัดของ 10,000 บรรทัดฉันสามารถใช้: split -dl 10000 words wrd และมันจะสร้างไฟล์หลายไฟล์ในรูปแบบ wrd.01, wrd.02 และอื่น ๆ แต่ฉันต้องการมีส่วนขยายเฉพาะสำหรับไฟล์เหล่านั้น - ตัวอย่างเช่นฉันต้องการรับไฟล์ wtd.01.txt, wrd.02.txt มีวิธีทำหรือไม่?
28 shell  filenames  split 

7
ทำไมคำว่า“ shell” จึงถูกนำมาใช้เพื่ออินเตอร์เฟซบรรทัดคำสั่ง?
ฉันอยากรู้เกี่ยวกับคำว่า "เชลล์" ฉันคิดว่าฉันรู้ว่ามันคืออะไร (ถึงแม้ว่าความแตกต่างระหว่าง "เชลล์" และ "เทอร์มินัล" ยังคงคลุมเครือ) แต่ทำไมคำว่า "เชลล์" จึงถูกเลือกให้อธิบายโปรแกรมประเภทนี้ สิ่งนี้อาจดูไม่สำคัญ แต่โดยปกติเมื่อคำที่เลือกนั้นทำให้ฉันงง

1
$ _ vs! $. อาร์กิวเมนต์สุดท้ายของคำสั่งก่อนหน้าและการเปลี่ยนเส้นทางผลลัพธ์
คำถามเกี่ยวกับตัวแปรพิเศษ เอกสารอธิบายว่า: !!:$ กำหนดอาร์กิวเมนต์สุดท้ายของคำสั่งก่อนหน้า สิ่งนี้อาจสั้นลงถึง! $ ( $_ขีดล่าง) ที่การเริ่มต้นเชลล์ตั้งค่าชื่อพา ธ สัมบูรณ์ที่ใช้เพื่อเรียกใช้เชลล์หรือเชลล์สคริปต์ที่จะดำเนินการตามที่ส่งผ่านในสภาพแวดล้อมหรือรายการอาร์กิวเมนต์ จากนั้นขยายไปยังอาร์กิวเมนต์สุดท้ายไปยังคำสั่งก่อนหน้าหลังจากการขยาย นอกจากนี้ยังกำหนดเป็นชื่อพา ธ แบบเต็มที่ใช้เพื่อเรียกใช้คำสั่งแต่ละคำสั่งที่ดำเนินการและวางไว้ในสภาพแวดล้อมที่ส่งออกไปยังคำสั่งนั้น จะต้องมีความแตกต่างบางอย่างที่ฉันไม่สามารถจับได้เพราะ: $ echo "hello" > /tmp/a.txt $ echo "!$" echo "/tmp/a.txt" /tmp/a.txt $ echo "hello" > /tmp/a.txt $ echo $_ hello อะไรคือความแตกต่าง?

4
ฉันจะบอกได้อย่างไรว่าโฟลเดอร์นั้นเป็น symlink จริงหรือไม่และฉันจะแก้ไขได้อย่างไรถ้ามันเสียหาย?
ฉันจะบอกได้อย่างไรว่าฉันมี symlink ทางลัดของบางประเภทหรือโฟลเดอร์ใน Linux โปรดดูภาพหน้าจอต่อไปนี้ อย่างที่คุณเห็นlsคำสั่งแสดงรายการวัตถุที่บางส่วนมีสีเป็นสีน้ำเงินเข้มในขณะที่วัตถุอื่น ๆ มีสีน้ำเงินอ่อน (สีฟ้า) วัตถุสีสีฟ้าเหล่านี้คืออะไร? ลิงก์สัญลักษณ์ที่แท้จริงเหล่านี้มีอะไรบ้าง อย่างที่คุณเห็นฉันไม่สามารถcdเรียกหนึ่ง hdd ได้ root@dm500hd:/# cd hdd -sh: cd: can't cd to hdd ฉันคิดว่ามันต้องเปลี่ยนเส้นทาง/media/hddและฉันสังเกตว่าโฟลเดอร์ hdd หายไป มีวิธีแก้ไขปัญหานี้หรือไม่? อัปเดต:นี่คือผลลัพธ์ของls -alคำสั่ง อย่างที่คุณเห็นมันบอกว่าhdd -> /media/hddมันมีสีแดง นี่หมายความว่ามันใช้งานไม่ได้หรือว่าถูกเมานท์อัตโนมัตินั่นคือเมื่อมีการเชื่อมต่อฟิสิคัลฮาร์ดดิสก์? อัปเดต:นี่คือผลลัพธ์ของgrep media /etc/auto*คำสั่ง สิ่งเหล่านี้/etc/auto.master:/media/netและ/etc/auto.networkรายการทำอะไร นี่คือผลลัพธ์ของls -Fal /mediaคำสั่ง นี่เป็นความช่วยเหลือหรือไม่? ... นี่คือผลลัพธ์ของstatและfileคำสั่งรวมถึงรายการของ / usr และ / bin สิ่งนี้ช่วยฉันได้ไหม? ... …
28 linux  shell  symlink 

5
การสลับ Regex / หรือโอเปอเรเตอร์ (foo | bar) ใน GNU หรือ BSD Sed
ฉันไม่สามารถทำงานได้ เอกสารของ GNU sed บอกว่าจะหลบหนีไปป์ แต่นั่นไม่ได้ผลหรือใช้ไพพ์แบบตรงโดยไม่ต้องหลบหนี เพิ่ม parens ทำให้ไม่มีความแตกต่าง $ echo 'cat dog pear banana cat dog' | sed 's/cat|dog/Bear/g' cat dog pear banana cat dog $ echo 'cat dog pear banana cat dog' | sed 's/cat\|dog/Bear/g' cat dog pear banana cat dog

4
ทดสอบว่าตัวแปรว่างในเชลล์สคริปต์หรือไม่
ฉันได้เห็นเทคนิคต่อไปนี้ใช้หลายครั้งในหลาย ๆ เชลล์เพื่อทดสอบว่าตัวแปรว่างเปล่าหรือไม่: if [ "x$1" = "x" ]; then # Variable is empty fi มีข้อได้เปรียบอะไรบ้างในการใช้สิ่งนี้มากกว่าที่ยอมรับมากกว่านี้if [ -z "$1" ]? มันอาจเป็นปัญหาการพกพาหรือไม่?

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