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

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

2
รุ่นสุ่มของ seq สำหรับสร้างลำดับของตัวเลข / คำแบบสุ่ม?
บางครั้งที่ผ่านมาฉันใช้เครื่องมือคล้าย seq สำหรับการพิมพ์ลำดับของตัวเลขที่สร้างแบบหลอกหลอกไปยัง stdout คุณสามารถระบุช่วงเมล็ดและจำนวนตัวอย่างและอีกมากมาย ฉันเพิ่งลืมชื่อของเครื่องมือนี้ ใครช่วยฉันออกได้บ้าง บางทีคุณอาจรู้จักเครื่องมือขั้นสูงที่สนับสนุนการแจกแจงความน่าจะเป็นต่าง ๆ หรือแม้แต่การสร้างลำดับของคำสุ่มภายใต้ตัวอักษรและการกระจายความยาว / อักขระที่แตกต่างกัน

1
ทำไม Ctrl-C ไม่ทำงาน
ฉันแค่กดCtrlcสองครั้งที่กระสุนของฉันเพื่อหยุดกระบวนการที่ใช้เวลานานกว่าจะเสร็จ ^C ถูกสะท้อนสองครั้ง แต่กระบวนการก็ยังดำเนินต่อไป ทำไมไม่Ctrlcออกจากกระบวนการเหมือนปกติ

2
บังคับให้ SSH ถามวลีรหัสผ่านส่วนตัวของฉันในเชลล์ (ไม่ใช่ในหน้าต่าง)
เมื่อฉันใช้ SSH เป็นครั้งแรกหลังจากบู๊ตเครื่องจะถามฉันว่าคีย์ส่วนตัวของฉันกำลังปลดล็อกวลีรหัสผ่าน (ซึ่งเป็นพฤติกรรมที่ฉันคาดไว้) แต่มันทำในหน้าต่างไม่ใช่ในเชลล์ (คล้ายกับgksudoVS sudo) นี่น่าผิดหวัง (ฉันต้องใช้เมาส์คลิกที่หน้าต่าง) และบางครั้งก็ทำให้เกิดข้อผิดพลาด (ฉันใช้ Guake terminal บางครั้งในแบบเต็มหน้าจอในกรณีนี้ฉันไม่สามารถโฟกัสบนหน้าต่าง SSH และฉันถูกบังคับให้รีสตาร์ท X ) ดังนั้นคำถามของฉันคือ: มีวิธีบังคับ SSH เพื่อขอรหัสผ่านคีย์ส่วนตัวของฉันในบรรทัดคำสั่งแทนที่จะ popping หน้าต่างหรือไม่

4
ประสิทธิภาพของลูปเทียบกับการขยาย
ต้องการคำแนะนำจากผู้เชี่ยวชาญในการเปรียบเทียบด้านล่าง: ส่วนของรหัสโดยใช้ลูป: for file in `cat large_file_list` do gzip -d $file done ส่วนของรหัสโดยใช้การขยายอย่างง่าย: gzip -d `cat large_file_list` อันไหนจะเร็วกว่ากัน? ต้องจัดการกับชุดข้อมูลขนาดใหญ่

1
ทำไมเครื่องหมายตัวหนอน (~) ไม่ขยายเมื่อใช้กับอาร์กิวเมนต์ CLI ที่ขึ้นต้นด้วยขีดกลาง
ฉันเสียเวลาสองสามชั่วโมงในการพยายามเรียกใช้เซิร์ฟเวอร์ VNC (x0vncserver) และลูกค้าปฏิเสธที่จะเชื่อมต่อกับข้อความแปลก ๆ ที่ No password configured for VNC Auth เซิร์ฟเวอร์ยังพิมพ์ข้อผิดพลาดนี้ SVncAuth: opening password file '~/.vnc/passwd' failed ตกลงฉันเสียเวลามากจนกว่าฉันจะรู้ว่าตัวหนอนไม่ได้ถูกขยายโดยเชลล์หรือโดย x0vncserver จากนั้นฉันก็ทำการทดสอบเหล่านี้ $ echo --PasswordFile=~/.vnc/passwd --PasswordFile=~/.vnc/passwd แต่ $ echo PasswordFile=~/.vnc/passwd PasswordFile=/home/tichomir/.vnc/passwd ทำไมถึงเป็นอย่างนั้น? ทำไมเชลล์ปฏิเสธที่จะขยายตัวหนอนถ้าอาร์กิวเมนต์เริ่มต้นด้วยเส้นประ? ฉันคิดว่าตัวหนอนจะขยายตราบใดที่มันไม่ได้ยกมา แต่เห็นได้ชัดว่ามีกฎอื่นที่เข้ามาเล่น?
9 bash  shell  tilde 

7
ฉันจะอ้างอิงการขยายตัวแปรภายในสตริงเพื่อหลีกเลี่ยงการแยกคำได้อย่างไร
$ myvar="/path to/my directory" $ sudo bash -c "cd $myvar" ในกรณีเช่นนี้ฉัน$myvarจะอ้างอิงเพื่อหลีกเลี่ยงการแยกคำเนื่องจากช่องว่างสีขาวในค่าของได้myvarอย่างไร
9 bash  shell  sudo  quoting 

1
tr a </ etc / hosts | sort -r | pr -d> / etc / hosts
ในบรรทัดนี้: tr a A &lt; /etc/hosts | sort -r |pr -d &gt; /etc/hosts ผลลัพธ์ที่คาดหวังคืออะไร ฉันรู้ว่าตัวพิมพ์เล็ก 'a' จะเปลี่ยนเป็นตัวพิมพ์ใหญ่ 'A' แต่จะทำอะไรต่อไป ไฟล์ต้นฉบับจะถูกเขียนทับเนื่องจากการเปลี่ยนเส้นทางเป็นชื่อไฟล์เดียวกันหรือไม่

3
การขยายตัวเชลล์ (A | B) ในชื่อไฟล์?
เป็นไปได้หรือไม่ที่จะขยายorทางเลือกในเชลล์เมื่ออ่านไฟล์ตัวอย่าง สิ่งที่ฉันหมายถึงคือการgrepสนับสนุนไวยากรณ์ที่ต้องการ(A|B)จับคู่ A หรือ B ในไฟล์ ในทำนองเดียวกันถ้าฉันมีไฟล์เหล่านี้: file1.txt file2.txt file3.txt file4.txt file5.txt ฉันทำได้cat file{1..5}.txtในbashขณะที่มันขยายช่วง มีวิธีที่เท่าเทียมกันในการทำเช่นนี้เพียงไม่กี่ไฟล์? เช่นcat file(1|5).txtและพิมพ์ 2 เหล่านั้นเท่านั้น

1
แสดง STDOUT ก่อน STDERR หรือไม่
ฉันใหม่เพื่อทุบตีและฉันไม่สามารถให้ชีวิตของฉันคิดออกวิธีการเรียกใช้คำสั่งบางอย่างสมมติ./fffและพิมพ์ stdouts ปกติก่อน stderr (ฉันสับสนเกี่ยวกับความหมายของตัวเอง) ตัวอย่างเช่น $ printf "I am a\ndrill\n" &gt; fff; $ cat fff nofile fff nofile fff I am a drill cat: nofile: No such file or directory I am a drill cat: nofile: No such file or directory I am a drill ต้องการพิมพ์เช่น: I am a …

4
แยกสตริงบนโคลอนใน / bin / sh
dashสคริปต์ของฉันใช้พารามิเตอร์ในรูปแบบของhostname:portคือ: myhost:1234 ในขณะที่พอร์ตเป็นทางเลือกเช่น: myhost ฉันต้องอ่านโฮสต์และพอร์ตเป็นตัวแปรแยกต่างหาก ในกรณีแรกฉันทำได้: HOST=${1%%:*} PORT=${1##*:} แต่นั่นจะไม่ทำงานในกรณีที่สองเมื่อพอร์ตถูกละเว้น echo ${1##*:}เพียงแค่ส่งคืนชื่อโฮสต์แทนที่จะเป็นสตริงว่าง ใน Bash ฉันสามารถทำได้: IFS=: read A B &lt;&lt;&lt; asdf:111 dashแต่นั่นไม่ได้ทำงานใน ฉันสามารถแยกสตริงบน:ในประโดยไม่ต้องเรียกใช้โปรแกรมภายนอก ( awk, trฯลฯ )?
9 shell  string  dash 

3
การป้องกันคำสั่งเชลล์ด้วยตัวแปรสตริง
ภายในภาษาการเขียนโปรแกรมฉันรันคำสั่งเชลล์แบบง่าย ๆ cd var; echo &gt; create_a_file_here ด้วยvarเป็นตัวแปรที่มีสตริง (หวังว่า) ไดเร็กทอรีไปยังตำแหน่งที่ฉันต้องการสร้างไฟล์ "create_a_file_here" ตอนนี้ถ้ามีคนเห็นบรรทัดของรหัสนี้มันเป็นไปได้ที่จะใช้ประโยชน์จากมันโดยการกำหนดเช่น: var = "; rm -rf /" สิ่งต่าง ๆ อาจดูน่าเกลียด วิธีหนึ่งในการหลีกเลี่ยงกรณีข้างต้นอาจเป็นการค้นหาสตริงในvarสำหรับอักขระพิเศษบางตัวเช่น ';' ก่อนดำเนินการคำสั่งเชลล์ แต่ฉันสงสัยว่าสิ่งนี้ครอบคลุมการหาประโยชน์ที่อาจเกิดขึ้นทั้งหมด ไม่มีใครรู้วิธีที่ดีในการตรวจสอบว่า "cd var" เปลี่ยนเฉพาะไดเรกทอรีและไม่มีอะไรอีกหรือไม่

10
Bash: แยกหนึ่งในสี่ส่วนของที่อยู่ IPv4
เราสามารถใช้ไวยากรณ์${var##pattern}และ${var%%pattern}แยกส่วนสุดท้ายและส่วนแรกของที่อยู่ IPv4: IP=109.96.77.15 echo IP: $IP echo 'Extract the first section using ${var%%pattern}: ' ${IP%%.*} echo 'Extract the last section using ${var##pattern}: ' ${IP##*.} เราจะแยกส่วนที่สองหรือสามของที่อยู่ IPv4 โดยใช้การขยายพารามิเตอร์ได้อย่างไร นี่คือโซลูชันของฉัน: ฉันใช้อาร์เรย์และเปลี่ยนตัวแปร IFS :~/bin$ IP=109.96.77.15 :~/bin$ IFS=. read -a ArrIP&lt;&lt;&lt;"$IP" :~/bin$ echo ${ArrIP[1]} 96 :~/bin$ printf "%s\n" "${ArrIP[@]}" 109 96 77 15 นอกจากนี้ผมได้เขียนแก้ปัญหาบางอย่างใช้awk, …

1
นิรุกติศาสตร์ของ $ PWD
นิรุกติศาสตร์$PWDคืออะไร? มันเป็นตัวย่อ? ฉันรู้ว่ามีคำสั่งpwdที่พิมพ์ไดเร็กตอรี่การทำงาน, แต่ในใจของฉัน, มันจะเหมาะสมกว่าที่จะตั้งชื่อตัวแปร$CWDสำหรับ Current Working Directory, เนื่องจากตัวแปรเชลล์มีข้อมูลมากกว่าพิมพ์
9 shell  history  pwd 

4
เอาต์พุต ps พร้อมกับรูปแบบวันที่ iso?
ฉันต้องการเรียงลำดับผลลัพธ์ตามlstart(เริ่มต้นกระบวนการ): ps -eo lstart,pid,cmd มีวิธีส่งออก lstart ในรูปแบบ ISO เช่น YYYY-MM-DD HH: MM: SS หรือไม่ แต่การเรียงลำดับเพียงอย่างเดียวไม่สามารถแก้ไขได้ ฉันต้องการรูปแบบวันที่ ISO จริง ๆ
9 shell  date  ps 

1
Carriage return ด้วยคำสั่ง echo
ฉันกำลังฝึกคำสั่ง echo พร้อมตัวเลือก\r(carriage return) ดังต่อไปนี้ echo -e "This is \r my college" เอาท์พุท: my college แต่เมื่อฉันเพิ่มอีกหนึ่งคำก่อนหน้า\rนี้เป็นด้านล่าง echo -e "This is the \r my college" จากนั้นให้ฉันเอาท์พุทเช่น: my college the ตัวอย่างอื่น echo -e "This is \r valid data" valid data echo -e "This is not a \r valid data" valid data a …
9 shell  echo  newlines 

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