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

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

6
อ่านไฟล์ที่มุ่งเน้นบรรทัดซึ่งอาจไม่ลงท้ายด้วยการขึ้นบรรทัดใหม่
ฉันมีไฟล์ชื่อ/tmp/urlFileที่แต่ละบรรทัดแสดงถึง url ฉันพยายามอ่านจากไฟล์ดังต่อไปนี้: cat "/tmp/urlFile" | while read url do echo $url done หากบรรทัดสุดท้ายไม่ลงท้ายด้วยอักขระขึ้นบรรทัดใหม่บรรทัดนั้นจะไม่ถูกอ่าน ฉันสงสัยว่าทำไม เป็นไปได้ไหมที่จะอ่านทุกบรรทัดไม่ว่าจะจบลงด้วยการขึ้นบรรทัดใหม่หรือไม่?

1
การจัดรูปแบบข้อความเป็นคอลัมน์
ฉันมีไฟล์ที่มีสองคอลัมน์ดังแสดงด้านล่าง (ตัวอย่าง): ไฟล์ 1: John 1 Peter 2 Michael Rod 3 Su 7 Louise 9 ฉันต้องการจัดรูปแบบนี้และผลลัพธ์ที่คาดหวังของฉันควรเป็น: ไฟล์ 1: John 1 Peter 2 Michael Rod 3 Su 7 Louise 9

3
เป็นไปได้หรือไม่ที่จะทำการทดแทนคำสั่ง shell โดยไม่ใช้เชลล์ย่อย?
ฉันมีสถานการณ์ที่เรียกการทดแทนคำสั่งโดยไม่ใช้ subshell ฉันมีสิ่งก่อสร้างเช่นนี้: pushd $(mktemp -d) ตอนนี้ฉันต้องการออกและลบไดเรกทอรีชั่วคราวในครั้งเดียว: rmdir $(popd) อย่างไรก็ตามมันใช้งานไม่ได้เพราะpopdไม่ได้ส่งคืนไดเรกทอรีที่ถูกตอก (มันจะส่งคืนไดเรกทอรีใหม่ที่เป็นปัจจุบันในปัจจุบัน) และเพราะมันถูกทำใน subshell สิ่งที่ต้องการ dirs -l -1 ; popd &> /dev/null จะส่งคืนไดเรกทอรี popped แต่ไม่สามารถใช้เช่นนี้: rmdir $(dirs -l -1 ; popd &> /dev/null) เพราะpopdจะส่งผลกระทบต่อ subshell เท่านั้น สิ่งที่เรียกว่าเป็นความสามารถในการทำเช่นนี้: rmdir { dirs -l -1 ; popd &> /dev/null; } แต่นั่นเป็นไวยากรณ์ที่ไม่ถูกต้อง มันเป็นไปได้ที่จะบรรลุผลนี้หรือไม่? (หมายเหตุ: ฉันรู้ว่าฉันสามารถบันทึกไดเรกทอรีชั่วคราวในตัวแปรได้ฉันพยายามหลีกเลี่ยงความจำเป็นที่จะต้องทำและเรียนรู้สิ่งใหม่ในกระบวนการ!)
11 shell  directory 

1
รายการชื่อของสมนามฟังก์ชันและตัวแปรใน zsh
ฉันต้องการวิธีที่จะแสดงชื่อ (โดยไม่มีเนื้อหา / เนื้อหา / ค่า) ของนามแฝง, ฟังก์ชั่น, ตัวแปร, อาร์เรย์ใน zsh มันควรมีพฤติกรรมที่เหมาะสมเช่นcompgen: compgen -a # will list all the aliases you could run. compgen -A function # will list all the functions you could run. compgen -A variable # will list all the variables defined. พื้นหลัง ฉันต้องการสิ่งนี้เพื่อพัฒนา env_parallel.zsh: https://www.gnu.org/software/parallel/env_parallel.html
11 shell  zsh 

3
มี Unix เทียบเท่ากับตัวแปรสภาพแวดล้อม Windows PATHEXT
ฉันสงสัยว่ามี Unix เทียบเท่ากับตัวแปรสภาพแวดล้อมของ Windows PATHEXTหรือไม่ สำหรับผู้ที่ไม่มีพื้นหลัง Windows: การเพิ่มคำต่อท้ายไฟล์เพื่อPATHEXTให้ฉันสามารถเรียกใช้สคริปต์โดยไม่ต้องพิมพ์คำต่อท้ายใน cmd.exe ตัวอย่างเช่นบนคอมพิวเตอร์ Windows ของฉัน PATHEXT มีคำต่อท้าย.plและเมื่อฉันต้องการรันสคริปต์ Perl ใน cmd.exe ฉันสามารถพิมพ์my-scriptและเรียกใช้งานได้ แต่ในการที่จะรันสคริปต์เดียวกันด้วยการทุบตีฉันต้องเขียนชื่อเต็ม: my-script.pl. ตั้งแต่ฉันทำงานทั้ง Windows และ Unix ในปัจจุบันฉันเกือบจะตกหลุมพรางของการลืมพิมพ์คำต่อท้ายเมื่อไปที่กล่อง Unix อีกครั้ง

2
การจับเอาท์พุท / การเปลี่ยนเส้นทางของคำสั่งที่ผูกมัดโดย &&
ฉันมีชุดของคำสั่ง b, c ที่ฉันกำลังผูกมัดร่วมกับ a && b && c&&: ฉันต้องการที่จะจับเอาท์พุทของคำสั่งทั้งหมดเพื่อ stdout และ stderr a && b && c 2>&1 > capture_file บันทึกเฉพาะเอาต์พุตจากคำสั่ง c

4
เพิ่มบรรทัดใหม่ในชื่อไฟล์ด้วย `mv`
มันเป็นคำถามที่จริงจัง ฉันทดสอบบางawkสคริปต์และฉันต้องการไฟล์ที่มีบรรทัดใหม่ในชื่อของพวกเขา เป็นไปได้หรือไม่ที่จะเพิ่มบรรทัดใหม่ในชื่อไฟล์ด้วยmv? ตอนนี้ฉันสามารถทำได้ด้วยtouch: touch "foo bar" ด้วยการสัมผัสฉันเพิ่มอักขระบรรทัดใหม่ต่อสำเนาและวาง แต่ฉันไม่สามารถเขียนfooReturnbarในเปลือกของฉัน ฉันจะเปลี่ยนชื่อไฟล์เพื่อให้มีการขึ้นบรรทัดใหม่ในชื่อไฟล์ได้อย่างไร แก้ไข 2015/06/28; 07:08 น หากต้องการเพิ่มบรรทัดใหม่ในzshฉันสามารถใช้Alt+Return

5
ดำเนินการคำสั่งเชลล์กับเหตุการณ์คลิกในหน้าเว็บ
มีวิธีรันคำสั่ง bash เมื่อฉันคลิกที่ข้อความในเบราว์เซอร์หรือไม่? หน้าเว็บอยู่ในคอมพิวเตอร์ A เบราว์เซอร์อยู่ในคอมพิวเตอร์ B: ฉันต้องการรันโค้ดบนคอมพิวเตอร์ B เช่นhsetrootเปลี่ยนภาพพื้นหลังเมื่อคลิกที่ภาพ
11 shell  browser  events 

4
การเก็บประวัติต่อไดเรกทอรีทำงาน (cf. ต่อเซสชันของเชลล์)
มีวิธีที่จะทำให้คุณสมบัติประวัติของเชลล์สมัยใหม่ถูกกำหนดขอบเขตไปยังเส้นทางหรือไม่? บริบทการทำงานของฉันแบ่งออกเป็นพา ธ บนระบบไฟล์และรูปแบบของกิจกรรมเชลล์เช่นคำสั่งที่ออกซ้ำ ๆ มีแนวโน้มที่จะแตกต่างกันไปในแต่ละโครงการ มันจะดีถ้าฉันสามารถขอบเขตคุณลักษณะประวัติกับคำสั่งที่ออกจากเส้นทางปัจจุบัน (หรือเส้นทางย่อย)

1
แสดงรายการระบบไฟล์ btrfs ทั้งหมดและไดรฟ์ย่อยในเชลล์
มีวิธีที่สะดวกที่จะได้รับข้อมูลเกี่ยวกับทุกbtrfs filesystems subvolumesโดยไม่ต้อง resorting C คือในPOSIX เปลือก ? /sys/fs/btrfsมีข้อมูลเกี่ยวกับระบบไฟล์เท่านั้นไม่มีอะไรในไดรฟ์ย่อยดังนั้นขณะนี้ฉันสิ้นสุดการติดตั้งระบบไฟล์ทั้งหมดในโฟลเดอร์ temp สแกนพวกเขาด้วยbtrfs subvol listแล้วแยกวิเคราะห์ผลลัพธ์ที่ได้ ไม่จำเป็นต้องพูดว่ามันน่าเกลียดพอสมควร นี่คือเคอร์เนล3.16.xและbtrfs-progs v3.14.1 (จากสต็อก Ubuntu 14.10) ด้านล่างเป็นสคริปต์ (น่าเกลียด) ที่ฉันใช้อยู่ในปัจจุบัน ฉันรู้ว่าฉันสามารถรับข้อมูลที่ฉันต้องการโดยใช้ C บริสุทธิ์และนั่นอาจเป็นสิ่งที่ฉันจะทำ แต่ฉันสงสัยว่ามีวิธีที่ง่ายกว่าและสง่างามกว่านี้หรือไม่ #!/bin/bash for i in /sys/fs/btrfs/*[!features]; do device="/dev/$(basename $i/devices/*)" mountpoint=/var/lib/btrfs/tmp/mnt/$(basename "$i") [ -d "$mountpoint" ] || mkdir "$mountpoint" grep -qs $mountpoint /proc/mounts [ $? -ne …
11 shell  btrfs 

4
ทำความเข้าใจกับการทดแทนคำสั่ง Read-a-File ของ Bash
ฉันพยายามเข้าใจว่า Bash ปฏิบัติต่อบรรทัดต่อไปนี้อย่างไร: $(< "$FILE") ตามหน้า Bash man นี่เทียบเท่ากับ: $(cat "$FILE") และฉันสามารถทำตามบรรทัดของการให้เหตุผลสำหรับบรรทัดที่สองนี้ Bash ดำเนินการขยายตัวตัวแปร$FILEเข้าสู่การทดแทนคำสั่งส่งค่า$FILEถึงcatcat ส่งออกเนื้อหาของ$FILEไปยังเอาต์พุตมาตรฐานการแทนที่คำสั่งเสร็จสิ้นโดยแทนที่ทั้งบรรทัดด้วยเอาต์พุตมาตรฐานที่เป็นผลมาจากคำสั่งด้านในและ Bash พยายามดำเนินการเช่นนั้น คำสั่งง่ายๆ อย่างไรก็ตามสำหรับบรรทัดแรกที่ฉันกล่าวถึงข้างต้นฉันเข้าใจว่า: Bash ทำการแทนที่ตัวแปรใน$FILEBash เปิด$FILEสำหรับการอ่านในอินพุตมาตรฐานอินพุตมาตรฐานจะถูกคัดลอกไปยังเอาต์พุตมาตรฐานการทดแทนคำสั่งเสร็จสิ้นและ Bash พยายามเรียกใช้มาตรฐานที่เป็นผลลัพธ์ เอาท์พุต ใครช่วยอธิบายให้ฉันฟังได้ว่าเนื้อหาของการเปลี่ยน$FILEจาก stdin เป็น stdout ได้อย่างไร?

2
วิธีการแสดงเฉพาะขนาดไฟล์ทั้งหมดของส่วนขยายเฉพาะโดยคำสั่ง `du`
ฉันมีไฟล์ PDF และไฟล์ html หลายร้อยรายการในไดเรกทอรี และฉันต้องการทราบขนาดไฟล์ PDF ทั้งหมด โดยคำสั่งdu -ch /var/fooฉันสามารถดูขนาดไฟล์ทั้งหมด แต่ฉันต้องการเพียงบรรทัดสุดท้ายคือขนาดรวม หากไดเรกทอรีมีเฉพาะไฟล์ PDF ฉันสามารถใช้-sตัวเลือกได้ แต่ตัวเลือกนี้ไม่สามารถใช้ได้ในเวลานี้ ฉันจะได้รับขนาดไฟล์เฉพาะบางประเภทได้อย่างไร

4
รับ PID ของคำสั่งใด ๆ ในลำดับของ piped ของคำสั่ง
ถ้า, ในbash, ฉันเรียกใช้งาน: cmd1 | cmd2 | ... | cmdi | ... | cmdn & ในกรณีที่cmd{1..n}ไม่ชัดเจนฉันจะได้รับ PID ได้cmdiอย่างไร อีกวิธีหนึ่งฉันจะส่งสัญญาณcmdiกระบวนการได้อย่างไร (ตัวอย่างเช่นส่งSIGUSR1?) pkill/ pgrep, pidofฯลฯ ดูไม่เหมือนคำตอบที่ดีเนื่องจากกรณีอื่น ๆcmdiอาจจะทำงานรวมทั้งเป็นส่วนหนึ่งของท่อเดียวกัน jobs -pให้ PID ของcmd1สำหรับฉัน i{1..n}สามารถเป็นอะไรก็ได้ใน
11 bash  shell  pipe  job-control 

4
ทดสอบว่าพอร์ตเทลเน็ตแอ็คทีฟภายในเชลล์สคริปต์หรือไม่
ฉันกำลังพยายามสร้างสคริปต์เพื่อทดสอบว่าสามารถเข้าสู่ระบบผ่าน telnet ได้หรือไม่ ฉันไม่ต้องการที่จะเข้าสู่ระบบจริงๆ; ดังนั้นจึงไม่จำเป็นต้องคาดหวัง ฉันแค่ต้องการดูว่าฉันสามารถรับพร้อมท์การเข้าสู่ระบบได้หรือไม่ สิ่งนี้ทำจากระบบ Linux ดังนั้นฉันพยายามใช้nc: nc 192.168.10.5 23 -w 1 | grep -q login if [ $? -eq 1 ] then echo "console is down" fi ปัญหาคือสิ่งนี้ทำให้คอนโซลของฉันล็อค ดูเหมือนว่า-wจะไม่ได้ลดลงการเชื่อมต่อ ฉันพยายามใช้ telnet ด้วย แต่ฉันไม่สามารถหยุดการเชื่อมต่อจากภายในสคริปต์ได้ พยายาม \echo "\035" | telnet 192.168.10.5 หยุดพักก่อนที่ฉันจะได้รับพรอมต์การเข้าสู่ระบบ

4
Bash จะให้กระบวนการพื้นหลังทำงานอย่างไร แต่รอให้กระบวนการอื่น ๆ ทำงาน
ฉันมี (ยัง) อีกwait, &, &&คำถามการควบคุมการไหล .. ว่าฉันมีสคริปต์บางอย่างเช่นนี้ที่ฉันต้องการทำงานมากที่สุดในเวลาเดียวกันเป็นไปได้: # may take some hours something InputA > IrrelevantA & something InputB > IrrelevantB & # may take an hour ( somethingElse InputA > OutputA & somethingElse InputB > OutputB & )&& combine OutputA OutputB > Result ...morestuff คำถามที่ 1: ในสคริปต์combineรอให้somethingElseกระบวนการทั้งสองเสร็จสิ้นในขณะที่somethingกระบวนการทั้งสองดำเนินการต่อหรือไม่ คำถามที่ 2: …

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