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

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

1
รูทเชลล์เห็น pip แต่ sudo pip“ ไม่พบคำสั่ง”
ผมได้ติดตั้งหลาม 2.7.8 ผ่านmakeและmake installแล้ว pip ผ่านได้รับ pip ฉันต้องทราบว่าฉันทำงานหลังพร็อกซีซึ่งฉันได้ตั้งค่าผ่าน http_proxy ftp_proxy https_proxy ใน ผู้ใช้ของฉัน ~/.zshrc ราก /root/.basrc ตอนนี้ฉันสามารถวิ่งได้ pip ในบัญชีผู้ใช้ของฉัน ในบัญชีรูท แต่ฉันไม่สามารถเรียกใช้ผ่านเชลล์ผู้ใช้ของฉันโดยใช้ sudo sudo pip sudo: pip: command not found เกิดอะไรขึ้นที่นี่?

5
วิธีอ่านบางบรรทัดหลังจากค้นหาข้อความ
ฉันจะอ่านจำนวนบรรทัดหลังจากค้นหาข้อความได้อย่างไร เช่น.: อ่าน 2 บรรทัดถัดไปหลังจากค้นหา "Unix" บน: Test 1 Test 2 Test 3 Test 4 UNIX Test 5 Test 6 Test 7 Test 8 Test 9 ผลลัพธ์สามารถ: Test 5 Test 6 หมายเหตุ: "Unix" ในตัวอย่างที่ผ่านมาเป็นอาร์กิวเมนต์และมันอาจเป็นข้อความอื่น ๆ สิ่งที่ฉันมี: ฉันยังขาดความคิดต้องการแค่แสงสว่าง กำลังคิดที่จะสร้างสคริปต์อื่นขึ้นมาเพื่อทำสิ่งนั้น
12 bash  shell 

5
จำนวนอักขระในเอาต์พุตของคำสั่งเชลล์
ฉันกำลังเขียนบทซึ่งความต้องการในการคำนวณจำนวนตัวอักษรในการส่งออกคำสั่งในขั้นตอนเดียว ตัวอย่างเช่นการใช้คำสั่งreadlink -f /etc/fstabควรส่งคืน10เนื่องจากผลลัพธ์ของคำสั่งนั้นมีความยาว 10 อักขระ สิ่งนี้สามารถเกิดขึ้นได้กับตัวแปรที่เก็บไว้โดยใช้รหัสต่อไปนี้: variable="somestring"; echo ${#variable}; # 10 น่าเสียดายที่การใช้สูตรเดียวกันกับสตริงที่สร้างคำสั่งไม่ทำงาน: ${#(readlink -f /etc/fstab)}; # bash: ${#(readlink -f /etc/fstab)}: bad substitution ฉันเข้าใจว่าเป็นไปได้ที่จะทำสิ่งนี้โดยการบันทึกผลลัพธ์เป็นตัวแปรแรก: variable=$(readlink -f /etc/fstab); echo ${#variable}; แต่ฉันต้องการลบขั้นตอนพิเศษ เป็นไปได้ไหม ความเข้ากันได้กับ Almquist shell (sh) โดยใช้เฉพาะยูทิลิตี้ที่อยู่ในตัวหรือมาตรฐานเท่านั้น
12 shell  string  variable 

3
อะไรคือความแตกต่างของ -a และ -e ในนิพจน์เงื่อนไขของ bash?
จากman bash: CONDITIONAL EXPRESSIONS [...] -a file True if file exists. [...] -e file True if file exists. แล้วอะไรคือความแตกต่างระหว่าง[ -a $FILE ]และ[ -e $FILE ]ถ้ามี? หากไม่มีความแตกต่างจริงเหตุใดจึงมีค่าสถานะสองค่าสำหรับจุดประสงค์เดียวกัน
12 bash  shell  test 

3
เข้าไปในไดเรกทอรีที่ลิงค์โดยลิงค์
เมื่อฉันcdลิงค์เส้นทางปัจจุบันของฉันจะถูกนำหน้าด้วยเส้นทางของลิงก์แทนที่จะเป็นเส้นทางของไดเรกทอรีที่ลิงก์ไปยังลิงก์ เช่น ~/dirlinks/maths$ ls -l logic lrwxrwxrwx 1 tim tim 71 Jul 27 10:24 logic -> /windows-d/academic discipline/study objects/areas/formal systems/logic ~/dirlinks/maths$ cd logic ~/dirlinks/maths/logic$ pwd /home/tim/dirlinks/maths/logic ~/dirlinks/maths/logic$ cd .. ~/dirlinks/maths$ ฉันต้องการให้เส้นทางปัจจุบันของฉันเปลี่ยนไปเป็นเส้นทางของ dir ที่เชื่อมโยงเพื่อที่ฉันจะสามารถทำงานกับผู้ปกครอง dirs ของ dir ที่เชื่อมโยงได้เช่นกัน นอกจากlsการเชื่อมโยงเพื่อค้นหา dir ที่เชื่อมโยงจากนั้นcdเข้าไปยังมันมีวิธีใดบ้างที่จะทำให้สำเร็จได้ง่ายขึ้น? ตัวอย่างเช่นหลังจากcdเป็นลิงก์คุณจะเปลี่ยนเส้นทางปัจจุบันเป็นเส้นทางของ dir ที่เชื่อมโยงได้อย่างไร

3
ส่งคำสั่งหลายคำเพื่อรวม
flock -x -w 5 ~/counter.txt 'COUNTER=$(cat ~/counter.txt); echo $((COUNTER + 1)) > ~/counter.txt' ฉันจะส่งคำสั่งหลายคำสั่งให้flockเหมือนในตัวอย่างด้านบนได้อย่างไร เท่าที่ฉันเข้าใจflockใช้แฟล็กที่แตกต่างกัน (-x สำหรับเอกสิทธิ์, -w สำหรับการหมดเวลา) จากนั้นไฟล์ที่จะล็อกและจากนั้นคำสั่งให้เรียกใช้ ฉันไม่แน่ใจว่าฉันจะส่งคำสั่งสองคำไปยังฟังก์ชันนี้ได้อย่างไร (ตั้งค่าตัวแปรด้วยเนื้อหาของไฟล์ที่ล็อคแล้วเพิ่มไฟล์นี้) เป้าหมายของฉันที่นี่คือการสร้างส่วนเพิ่มขึ้นเล็กน้อยสำหรับไฟล์โดยการล็อคทุกครั้งที่สคริปต์พยายามเข้าถึงcounter.txtไฟล์

2
ทำไม `at 'เตือนฉันว่าคำสั่งจะถูกดำเนินการโดยใช้ / bin / sh? ถ้าฉันต้องการเปลือกที่แตกต่างกัน
ฉันพยายามที่จะใช้atจากภายในสคริปต์ของฉันและมันพิมพ์: คำเตือน: คำสั่งจะถูกดำเนินการโดยใช้ / bin / sh ฉันจะใช้เปลือกที่แตกต่างกันได้อย่างไรถ้าฉันต้องการ?
12 shell  at 

7
ประทับเวลาก่อนเสียงสะท้อน
มีวิธีที่ดีกว่าในการสร้างการประทับเวลาต่อหน้าecho? ขณะนี้ฉันทำเช่นนี้: #!/bin/sh if mount | grep -q /mnt/usb; then echo `date +%R\ ` "usb device already mounted" else echo `date +%R\ ` "mounting usb device..." mount -t msdosfs /dev/da0s1 /mnt/usb if mount | grep -q /mnt/usb; then echo `date +%R\ ` "usb device successfully mounted" fi fi ผลลัพธ์ควรมีลักษณะดังนี้: 10:36 …
12 shell  timestamps  echo 

4
ใช้คำสั่ง nohup หลายคำในพื้นหลัง
มีสองคำสั่ง cmd1 และ cmd2 ในทั้งสอง cmd2 ใช้เวลานานกว่าจะเสร็จสิ้น จำเป็นต้องเรียกใช้ cmd2 และ cmd1 พยายามเรียกใช้งานด้วยวิธีต่อไปนี้: bash$ (nohup ./cmd2>result2 &) && nohup ./cmd1>result1 & หรือ bash$ (nohup ./cmd2>result2 &) ; nohup ./cmd1>result1 & แต่ทั้งสองครั้งที่ฉันเห็น cmd1 ไม่รอให้ cmd2 เสร็จสิ้นและ result1 ก็จะเต็ม วิธีที่จะทำให้ cmd1 ทำงานหลังจาก cmd2 เมื่อทั้งสองควรเป็นกระบวนการ nohup และทำงานในพื้นหลัง?

3
การระบุตัวจัดการแพ็คเกจระบบ
มีวิธี (จากสคริปต์) เพื่อระบุตัวจัดการแพคเกจระบบเริ่มต้นหรือไม่ เพื่อชี้แจงสิ่งที่ฉันต้องการทำคือเรียกใช้คำสั่งที่กำหนดและใน Debian หรืออนุพันธ์ใด ๆ ของมันมันจะส่งคืนบางสิ่งเช่น "apt" ใน openSUSE มันจะส่งคืน "zypp" บน Fedora et al มันจะกลับมา "yum" บน Arch Linux มันจะคืนค่า "pacman" เป็นต้น ฉันรู้ว่าฉันสามารถทำสิ่งนี้กับสิ่งต่อไปนี้ฉันแค่สงสัยว่ามีวิธีที่แข็งแกร่งกว่านี้ซึ่งจะไม่พังทันทีที่มีการปฏิบัติการที่มีชื่อเดียวกัน which apt >/dev/null 2>&1 if [ $? -eq 0 ] then echo "apt" fi # etc...

2
การใช้ </ dev / null & ในบรรทัดคำสั่ง
ฉันพยายามรันโปรแกรมจาวาตัวอย่างโดยใช้บรรทัดคำสั่งต่อไปนี้ อย่างไรก็ตามฉันไม่ทราบว่าส่วนต่อท้ายที่&lt; /dev/null &amp;ใช้มีไว้เพื่ออะไร java -cp /home/weka.jar weka.classifiers.trees.J48 –t train_file &gt;&amp; log &lt; /dev/null &amp;

4
เปลี่ยนทรีไดเรกทอรีทั้งหมดเป็นชื่อตัวพิมพ์เล็ก
ฉันทำงานเกี่ยวกับการแปลงเว็บไซต์ ไฟล์ที่พวกเขาถูกเชื่อมโยงและให้บริการจากเว็บเซิร์ฟเวอร์เป็นกรณีที่ไม่สำคัญ แต่ฉันได้ทำการถ่ายโอนข้อมูลของเว็บไซต์ในระบบ linux ของฉันและฉันเขียนสคริปต์เพื่อย้ายข้อมูล ปัญหาคือฉันพบปัญหาความไวของตัวพิมพ์เล็กระหว่างสตริงลิงก์ในหน้าและตัวพิมพ์คำจริงในระบบไฟล์ ยกตัวอย่างเช่นหน้าอาจมีการเชื่อมโยงเช่นในขณะที่ไฟล์ที่เกิดขึ้นจริง&lt;a href='/subfolder/PageName.asp'&gt; /subfolder/pagename.aspในทำนองเดียวกันกับภาพ - อาจจะมี&lt;img src='spacer_sm.gif'&gt;Spacer_Sm.gif ดังนั้นความคิดของฉันคือการเปลี่ยนไดเรกทอรีและชื่อไฟล์ทั้งหมดให้เทียบเท่าตัวพิมพ์เล็กสำหรับการดาวน์โหลดไซต์ ฉันจะทำสิ่งนี้ได้อย่างไร (และอาจมีวิธีที่ดีกว่านี้) แม้ว่าจะมีคำสั่ง unix ที่มีการสลับ case-insensitve แต่ฉันกำลังใช้ php ดังนั้นคำสั่งระบบไฟล์บางตัวก็ไม่มีตัวเลือกสำหรับความไวของ case

4
เติมแท็บ zsh ในบรรทัดว่าง
ฉันต้องการ tcsh'ism ที่ฉันไม่สามารถหาได้: ในบรรทัดว่างที่ไม่มีเนื้อหาฉันต้องการกดปุ่มแท็บและดูเทียบเท่ากับ ls กล่าวคือฉันต้องการ $ &lt;tab&gt; เพื่อทำสิ่งอื่นจากนั้นให้ฉัน \ t ฉันได้พบแหล่งข้อมูลที่ยอดเยี่ยมสำหรับการทำคำสั่งให้เสร็จ แต่ไม่ใช่สำหรับกรณีพื้นฐานนี้ ความช่วยเหลือใด ๆ ในเรื่องนี้จะดีมาก! ขอบคุณ

2
เหตุใดฉันจึงไม่สามารถเปลี่ยนเชลล์ด้วยคำสั่ง chsh ได้
ฉันเรียนรู้คำสั่งใหม่อย่างน้อยฉันก็คิดว่าเพราะคำสั่งนี้: chshไม่ทำงานตามที่อธิบายไว้ มันอธิบายว่าทำงานเช่นนี้: cat /etc/shells รู้ว่าเชลล์ใดติดตั้งอยู่แล้วเพื่อให้คุณสามารถเลือกได้ ทำอย่างไรecho $SHELLให้รู้ว่าคุณใช้เชลล์ตัวไหน เลือกหนึ่งในเปลือกหอยและประเภท chsh -s /path/to/shell ป้อนรหัสผ่านและยืนยันecho $SHELLด้วยว่าคุณอยู่ในเชลล์ใหม่ ฉันได้ทำสิ่งนี้แล้วและฉันไม่ได้รับข้อความแสดงข้อผิดพลาดเมื่อป้อนรหัสผ่าน แต่ฉันยังอยู่ในเชลล์เดียวกัน % echo $SHELL /bin/bash % cat /etc/shells # /etc/shells: valid login shells /bin/sh /bin/dash /bin/bash /bin/rbash % chsh -s /bin/sh Password: % echo $SHELL /bin/bash

10
ลบคำที่ซ้ำกันทั้งหมดออกจากสตริงโดยใช้เชลล์สคริปต์
ฉันมีสตริงเหมือน "aaa,aaa,aaa,bbb,bbb,ccc,bbb,ccc" ฉันต้องการลบคำที่ซ้ำกันออกจากสตริงจากนั้นผลลัพธ์จะเป็นเช่นนั้น "aaa,bbb,ccc" ฉันลองรหัสนี้แหล่งที่มา $ echo "zebra ant spider spider ant zebra ant" | xargs -n1 | sort -u | xargs มันทำงานได้ดีกับค่าเดียวกัน แต่เมื่อฉันให้ค่าตัวแปรแล้วมันจะแสดงคำที่ซ้ำกันทั้งหมดด้วย ฉันจะลบค่าที่ซ้ำกันได้อย่างไร UPDATE คำถามของฉันคือการเพิ่มค่าที่สอดคล้องกันทั้งหมดลงในสตริงเดียวถ้าผู้ใช้เหมือนกันฉันมีข้อมูลเช่นนี้ -&gt; user name | colour AAA | red AAA | black BBB | red BBB | blue AAA | blue AAA | red …

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