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

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

4
นิพจน์ทั่วไปที่ใช้ \\ vs using \
ทำไม grep e\\.g\\. <<< "this is an e.g. wow" และ grep e\.g\. <<< "this is an e.g. wow" ทำสิ่งเดียวกัน ถ้าฉันเพิ่มเครื่องหมายสแลชที่สามมันก็มีผลลัพธ์เหมือนกัน แต่เมื่อฉันเพิ่มเครื่องหมายสแลชที่สี่มันไม่ทำงานอีกต่อไป สิ่งนี้เกี่ยวข้องกับคำถามจากการสอบแบบเก่าสำหรับชั้นเรียน มันถามว่าคนที่มีแบ็กสแลชสองตัวอันหนึ่งจะทำงานเพื่อเอาท์พุทบรรทัดด้วย "เช่น" ฉันคิดว่ามันไม่ทำงาน แต่ฉันพยายามทำให้แน่ใจและมันก็ทำเช่นนั้น คำอธิบายคืออะไร

2
สาเหตุที่ทำให้เกิดข้อผิดพลาด“ ไม่สามารถเรียกใช้ไฟล์ไบนารี่”
ฉันมีไฟล์ขนาดเล็กที่เริ่มต้นtmuxเซสชันแล้วสร้างบางหน้าต่าง หลังจากการแก้ไขข้อบกพร่องและการปรับเปลี่ยนบางอย่างทำงานได้ดีจนกระทั่งฉันเปลี่ยนชื่อไฟล์ข้อความ (ด้วยtmuxคำสั่ง) จากspamเป็นxset: $ source xset bash: source: /usr/bin/xset: cannot execute binary file ตอนนี้ฉันได้เปลี่ยนชื่อไฟล์กลับมาและใช้source spamงานได้อีกครั้ง แต่ฉันสงสัยว่าทำไมจึงเป็นเช่นนั้น /usr/binไฟล์ที่อยู่ในไดเรกทอรีบ้านของฉันและไม่ได้อยู่ใน
10 bash  shell 

4
เหตุใดจึงเลือกสาขา 'ถ้า [$ 1 =“ 1”]' เสมอแม้ว่าจะไม่ใช่ $ 1 ก็ตาม
ฉันมีเชลล์สคริปต์ชื่อ 'teleport.sh' เช่นนี้: if [ $1="1" ]; then shift mv "$@" ~/lab/Sun elif [ $1="2" ]; then shift mv "$@" ~/lab/Moon elif [ $1="3" ]; then shift mv "$@" ~/lab/Earth fi เมื่อฉันรัน: sh teleport.sh 2 testfile สิ่งนี้testfileถูกย้ายไปยัง~/lab/Sunไดเรกทอรีซึ่งทำให้ฉันสับสนมากเพราะฉันไม่ผ่าน 1 หรือ '1' ไปยังสคริปต์นั้น เกิดอะไรขึ้นที่นี่?
10 bash  shell  test 

4
เขียนข้อความระหว่าง Unix และ Windows
เป็นไปได้ไหมที่จะส่งข้อความระหว่างผู้ใช้สองคนใน LAN เดียวกัน แต่เป็น Windows แรกที่รันด้วย cmd และ Linux / Unix ตัวที่สอง? ฉันไม่ได้มองหาบริการส่งข้อความด่วน ฉันต้องการที่จะพิมพ์ในเปลือก Linux สิ่งที่ชอบ write user@192.168.x.x:port message เพื่อให้ผู้ใช้ Windows สามารถอ่านข้อความในหน้าต่าง cmd message; จากนั้นผู้ใช้ Windows ควรจะสามารถตอบกลับด้วยคำสั่งอื่น เป็นไปได้ไหม? ฉันได้อ่านเกี่ยวกับmsgคำสั่งWindows แล้วแต่มันไม่ทำงานในทุกเวอร์ชั่นของระบบปฏิบัติการ มีอะไรอีกไหม? แทนที่จะเป็น PuTTY ฉันต้องการใช้เชลล์ Linux และ Windows cmd

1
ใช้ inotify เพื่อตรวจสอบไดเรกทอรี แต่ไม่ทำงาน 100%
ฉันได้เขียนสคริปต์ทุบตีเพื่อตรวจสอบไดเรกทอรีเฉพาะ/root/secondfolder/: #!/bin/sh while inotifywait -mr -e close_write "/root/secondfolder/" do echo "close_write" done เมื่อผมสร้างไฟล์ชื่อfourth.txtใน/root/secondfolder/และเขียนสิ่งที่มันบันทึกและปิดมันมันจะออกผลลัพธ์ต่อไปนี้: /root/secondfolder/ CLOSE_WRITE,CLOSE fourth.txt อย่างไรก็ตามมันไม่ได้สะท้อน "close_write" ทำไมถึงเป็นอย่างนั้น?

3
ตัวแปรสภาพแวดล้อมไม่ได้ถูกตั้งค่าเมื่อฟังก์ชั่นของฉันถูกเรียกในไปป์ไลน์
ฉันมีฟังก์ชันแบบเรียกซ้ำต่อไปนี้เพื่อตั้งค่าตัวแปรสภาพแวดล้อม: function par_set { PAR=$1 VAL=$2 if [ "" != "$1" ] then export ${PAR}=${VAL} echo ${PAR}=${VAL} shift shift par_set $* fi } ถ้าฉันเรียกมันด้วยตัวมันเองมันจะตั้งค่าตัวแปรและ echoes เป็น stdout: $ par_set FN WORKS FN=WORKS $ echo "FN = "$FN FN = WORKS การเปลี่ยนเส้นทาง stdout ไปยังไฟล์ยังใช้งานได้: $ par_set REDIR WORKS > out cat …


4
ยุติกระบวนการพื้นหลังทั้งหมด
ฉันมีStoppedกระบวนการพื้นหลังเล็กน้อย kill $(jobs -p)และkill `jobs -p`ไม่มีผลกระทบ kill %1, kill %2ฯลฯ ประสบความสำเร็จในการยกเลิกแต่ละกระบวนการ ฉันจะฆ่าทุกกระบวนการพื้นหลังด้วยคำสั่งเดียวได้อย่างไร นอกจากนี้ทำไมสองคำสั่งแรกไม่ทำงานสำหรับฉัน ฉันใช้ Linux Mint 15, 64 บิต

2
เปลือกสามารถ“ รุกมากขึ้น” ได้หรือไม่?
My Gentoo Linux รวบรวมด้วยการตั้งค่าสถานะ USE ที่ไม่เหมาะสม : # sudo su - Password: Hold it up to the light --- not a brain in sight! Password: นอกจากนี้ยังเป็นไปได้ที่จะเลือกโชคชะตาตามระดับความไม่พอใจ: # fortune -o kernelcookies | cowsay -b _________________________________________ / /* This is total bullshit: */ \ | | \ linux-2.6.6/drivers/video/sis/init301.c / ----------------------------------------- \ ^__^ …
10 shell  cowsay 

1
จะค้นหาไฟล์ที่มีบรรทัดใหม่ในชื่อไฟล์ได้อย่างไร
ฉันพยายามค้นหาไฟล์ที่มีบรรทัดใหม่ในชื่อไฟล์ แต่ฉันไม่สามารถคิดได้ว่าจะใช้รูปแบบใด ผลงานดังต่อไปนี้ แต่ไม่มีประโยชน์มากถ้าฉันต้องการใช้ในโค้ดที่เยื้อง find . -name '* *' ฉันลองสองสิ่งนี้และพวกเขาประสบความสำเร็จในการค้นหาชื่อไฟล์ที่มีตัวอักษรn : find . -name '*\n*' find . -name "*\n*" จากนั้นฉันก็พบวิธีเขียนลำดับ backslash escape และลองสิ่งนี้: find . -name "*$'\n'*" แต่นั่นไม่พบอะไรเลย ฉันจะเขียนรูปแบบได้อย่างไร
10 shell  find  patterns 

6
วิธีการรับหลายบรรทัดออกจากไฟล์โดย regex?
วิธีการรับหลายบรรทัดออกจากไฟล์โดย regex? ฉันมักจะต้องการรับหลายบรรทัด / แก้ไขหลายบรรทัดโดย regex กรณีตัวอย่าง: ฉันกำลังพยายามอ่านส่วนหนึ่งของไฟล์ XML / SGML (ไม่จำเป็นต้องมีรูปแบบที่ดีหรืออยู่ในรูปแบบที่สามารถคาดเดาได้ดังนั้น regex จะปลอดภัยกว่าตัวแยกวิเคราะห์ที่เหมาะสมนอกจากนี้ฉันอยากจะทำเช่นนี้ได้เล็กน้อย ไฟล์ที่ไม่มีโครงสร้างซึ่งรู้จักคำสำคัญเพียงบางคำ) ในเชลล์สคริปต์ (ทำงานบน Solaris และ Linux) ตัวอย่าง XML: <tag1> <tag2>bar</tag2> </tag1> <tag1> <tag2>foo</tag2> </tag1> จากนี้ฉันอยากจะอ่าน<tag1>มันถ้ามันมีfooบางแห่งในนั้น regex ที่ชอบ(<tag1>.*?foo.*?</tag1>)ควรให้ส่วนที่ถูกต้อง แต่เครื่องมือที่ชอบgrepและsedใช้ได้กับฉันในบรรทัดเดียวเท่านั้น ฉันจะได้รับ <tag1> <tag2>foo</tag2> </tag1> ในตัวอย่างนี้?
10 shell  sed  grep 


2
ถ้าฉันพิมพ์“ sudo” ที่จุดเริ่มต้นของสายการบินเดียวมันจะใช้กับคำสั่งที่เหลือหรือไม่?
หากฉันพิมพ์sudoที่จุดเริ่มต้นของซับในหนึ่งจะใช้กับคำสั่งที่เหลือหรือไม่? กล่าวอีกนัยหนึ่งคือ: sudo foo | foo2 | foo3 เทียบเท่ากับสิ่งนี้: sudo foo | sudo foo2 | sudo foo3
10 bash  shell  sudo 

4
รับตำแหน่งเคอร์เซอร์แนวตั้ง
นี่อาจฟังดูแปลก ๆ แต่ฉันรู้วิธีตั้งตำแหน่งเคอร์เซอร์แนวตั้งใน Bash ดังนี้: echo -e "\e[12H" สิ่งนี้เลื่อนเคอร์เซอร์ไปที่บรรทัดที่ 12 (เริ่มต้นด้วย 1) ดังนั้นฉันจะรับตำแหน่งเคอร์เซอร์ (หมายเลขบรรทัด) โดยใช้ linux bash ได้อย่างไร มันจะมีประโยชน์ถ้าฉันสามารถเก็บค่านี้ไว้ในตัวแปรเพื่อให้ฉันสามารถคำนวณได้ แก้ไข: นี่เป็นข้อผิดพลาดที่ฉันได้รับ: $ sh rowcol.sh -en read: 9: Illegal option -d test.sh: 12: Bad substitution
10 shell  terminal 

1
คุณสามารถสร้าง "นามแฝง" ใน Bash ได้หลายวิธี
ฉันเพียงรู้ของสองวิธีและalias foo=barfunction foo() { bar } เหตุผลที่ฉันถามคือ - ทั้งหมดในเซสชัน bash ของฉัน - ฉันไม่สามารถเรียกใช้lnคำสั่งได้เนื่องจากbashมีข้อผิดพลาด-bash: /usr/local/.../ln: No such file or directory(ซึ่ง/usr/local/.../เป็นหนึ่งในรายการในPATHตัวแปรสภาพแวดล้อมของฉัน) มันไม่ใช่PATHปัญหาเพราะถ้าฉันเรียกใช้which lnมันจะเอาท์พุทไบนารีที่คาดหวังของ/usr/bin/ln(ซึ่งฉันสามารถทำงานได้ดีถ้าฉันระบุเส้นทางที่แน่นอน) ฉันยังตรวจสอบlnในของฉันaliasและfunctionประกาศและไม่มีอะไร: $ declare -f | grep ln $ alias | grep ln ปัญหากำลังเกิดขึ้นในเซสชัน bash เดียว ถ้าฉันเริ่มเชลล์ใหม่มันจะทำงานได้ดีอีกครั้ง แต่ฉันอยากรู้ว่าอะไรทำให้เกิดปัญหานี้ในทันทีในเซสชั่นของการทุบตีนี้ ความคิดใด ๆ เกี่ยวกับสิ่งที่อาจทำให้เกิดสิ่งนี้
10 bash  shell  alias 

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