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

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

2
คั่นเนมสเปซสำหรับฟังก์ชั่นและตัวแปรในเชลล์ POSIX
ในเส้นประฟังก์ชั่นและตัวแปรดูเหมือนจะอยู่ในเนมสเปซที่แยกต่างหาก: fn(){ fn="hello world" } fn; echo "The value is $fn!" #prints: The value is hello world! fn; echo "The value is $fn!" #prints: The value is hello world! #the fn variable doesn't conflict with the fn function นี่เป็นคุณลักษณะเฉพาะหรือการรับประกัน POSIX หรือไม่
13 shell  posix  dash 

8
การย้อนกลับเนื้อหาของตัวแปรด้วยคำพูด
ดังนั้นถ้าฉันมีตัวแปร VAR='10 20 30 40 50 60 70 80 90 100' และสะท้อนออกมา echo "$VAR" 10 20 30 40 50 60 70 80 90 100 อย่างไรก็ตามยิ่งสคริปต์ฉันต้องย้อนกลับลำดับของตัวแปรนี้จึงแสดงเป็นสิ่งที่ต้องการ echo "$VAR" | <code to reverse it> 100 90 80 70 60 50 40 30 20 10 ฉันพยายามใช้ rev และมันกลับด้านทุกอย่างดังนั้นมันจึงออกมาเป็น echo "$VAR" | rev 001 …
13 linux  bash  shell  variable 

2
มีวิธีใดบ้างที่เชลล์สคริปต์จะรู้ว่าโปรแกรมใดทำงานหรือไม่
ใน * nix world มีวิธีใดที่เชลล์สคริปต์จะมีข้อมูลเกี่ยวกับโปรแกรมที่เรียกใช้งานหรือไม่ ตัวอย่าง: /path/to/script1 /path/to/script_xyz ในสถานการณ์สมมตินี้script_xyzจะมีข้อมูลเส้นทาง ( /path/to/script1) หรือ ประมวลผล PID ของนิติบุคคลที่ได้ดำเนินการ หมายเหตุ: ฉันอยากรู้เกี่ยวกับการแก้ปัญหาและแนวทางที่แตกต่างกันฉันไม่คาดหวังว่าสิ่งนี้จะเป็นไปได้จริง

2
วิธีใช้ตัวละครพิเศษเป็นตัวละครธรรมดา
คำถามมากมายเช่น 'วิธีพิมพ์อักขระสองคำพูด (") ได้อย่างไร กำลังถูกถามและเราไม่ต้องการให้ชุมชนของเรามีคำตอบเหมือนกัน (พิมพ์เป็น\"ถ้าไม่อยู่ใน's, "ถ้าอยู่ใน's) ดังนั้นคำถามอยู่ที่นี่ คุณไม่สามารถพิมพ์ตัวอักษรพิเศษลงในเทอร์มินัลแบบปกติเช่นคำสั่งนี้จะล้มเหลว: echo Updates (11) ดังนั้นวิธีการพิมพ์ในตัวอักษรเหล่านี้ใน terminal เช่นถ้าพวกเขาเป็นคนปกติ? !#$^&*?[](){}<>~;'"\|<space><tab><newline>

1
การตั้งค่านามแฝงทุบตีชั่วคราวเมื่อเข้าสู่โฟลเดอร์
บางครั้งฉันชอบที่จะมีนามแฝงทุบตีที่กำหนดเองมากและอาจจะเป็นปุ่มลัดเมื่อฉันป้อนในโฟลเดอร์ (อาจเป็นโครงการที่ฉันเคยพิมพ์คำสั่งจำนวนมากจาก CLI) ให้สมมติว่าเมื่อฉันป้อนโฟลเดอร์เช่น "projectAlpha /" ฉันคาดหวังชื่อแทนที่กำหนดเองเช่น: alias doTaskX='./app arg1 arg2...|filter arg1 arg2...' ... ยิ่งกว่านั้นฉันคิดว่า: แสดงข้อความที่เป็นประโยชน์แสดงนามแฝงและคำสั่งทั่วไป แสดง keybindings ที่กำหนดเองทั่วไปบางอย่างสำหรับโครงการของฉัน แต่ทันทีที่ฉันออกจากโครงการของฉันการตั้งค่าเหล่านี้จะไม่สามารถใช้ได้ วิธีที่ดีที่สุดที่จะทำวันนี้คืออะไร?
13 bash  shell  alias 

3
วิธีลบ \ n ระหว่างเอาต์พุตของคำสั่ง echo สองคำสั่ง?
ฉันมีไฟล์ข้อความที่มีชื่อไฟล์หนึ่งชื่อในแต่ละบรรทัด: 111_c4l5r120.png 123_c4l4r60.png 135_c4l4r180.png 147_c4l3r60.png 15_c4l1r120.png ... ฉันต้องการแปลงเป็นรูปนี้: 111_c4l5r120.png 111 123_c4l4r60.png 123 135_c4l4r180.png 135 147_c4l3r60.png 147 15_c4l1r120.png 15 ... ใช้รหัสนี้: #!/bin/bash while IFS='' read -r line || [[ -n "$line" ]]; do echo "$line" >> output.txt echo "$line" | cut -d'_' -f 1 >> output.txt done < "$1" แต่ผลลัพธ์คือ: 111_c4l5r120.png …

1
ทำไมบางโปรแกรมกลับสู่เชลล์ทันทีขณะที่บางโปรแกรมไม่ทำจนกว่าการประมวลผลจะเสร็จสมบูรณ์?
ฉันได้อ่านจากหนังสือระบบปฏิบัติการสมัยใหม่ว่าเมื่อคำสั่งถูกเรียกใช้เชลล์จะสร้างกระบวนการลูกรอจนกระทั่งลูกประมวลผลเสร็จสิ้นแล้วจึงรอคำสั่งอื่นจากผู้ใช้ geditแท้จริงนี่คือกรณีที่หลายโปรแกรมเช่น geditขั้วไม่ได้ใช้คำสั่งจนกว่าฉันจะได้ปิด อย่างไรก็ตามเมื่อฉันเปิดตัวแก้ไขรหัสatomเชลล์จะคืนค่าทันทีพร้อมที่จะยอมรับคำสั่งถัดไปแม้จะมีตัวแก้ไขที่ทำงานอยู่ การปิดเทอร์มินัลไม่ได้ปิดอะตอม นี่หมายความว่าตัวแก้ไขเปิดไม่เป็นกระบวนการลูกหรือไม่? กลไกพื้นฐานที่ทำให้สิ่งนี้เป็นไปได้คืออะไร? วิ่งps au | grep atomให้ <username> 8042 0.0 0.0 15944 2264 pts/1 S+ 00:55 0:00 grep --color=auto atom

2
ทำไม `watch` สร้าง` ls / tmp` ทำรายการเนื้อหาของ $ HOME?
ฉันพยายามดูจำนวนไฟล์ใน/tmp/ไดเรกทอรีของฉัน สำหรับสิ่งนี้ฉันคิดว่าคำสั่งนี้จะทำงาน: watch sh -c 'ls /tmp/|wc -l' แต่ดูเหมือนว่าจะทำงานเหมือนlsไม่มีข้อโต้แย้ง คือผมอยู่ในและฉันได้รับจำนวนไฟล์ที่มีแทน~ /tmp/ฉันพบวิธีแก้ปัญหาซึ่งดูเหมือนจะทำงานได้: watch sh -c 'ls\ /tmp/|wc -l' แต่ทำไมฉันต้องหลบหนีช่องว่างระหว่างlsและ/tmp/? คำสั่งถูกแปลงโดยwatchเพื่อให้lsเอาต์พุตถูกป้อนเข้าwcแต่/tmp/ไม่ถูกส่งผ่านเป็นอาร์กิวเมนต์ไปยังls?
13 shell  ls  watch 

2
วิธีลบพารามิเตอร์ตำแหน่งจาก $ @
โดยทั่วไปฉันต้องการ "ถอนออก" เกิดขึ้นครั้งแรก-infจากรายการพารามิเตอร์ (พารามิเตอร์ที่เหลือจะถูกส่งผ่านไปยังคำสั่งอื่น) สคริปต์ที่ฉันมีมีโครงสร้างต่อไปนี้: #!/bin/sh <CODE> for POSITIONAL_PARAM in "$@" do <CODE> if [ "$POSITIONAL_PARAM" = '-inf' ] then <PLUCK $POSITIONAL_PARAM FROM $@> break fi <CODE> done <CODE> some-other-command "$@" # end of script มีวิธีที่ดีในการทำเช่นนี้? BTW แม้ว่าฉันสนใจส่วนใหญ่อยู่ในคำตอบที่ใช้บังคับกับฉันสนใจยังอยู่ในคำตอบเฉพาะ/bin/sh/bin/bash

3
เหตุใดจึงเป็น rm -rf และไม่ใช่ rmdir -rf
rm -rfฉันได้รับเสมออยากรู้อยากเห็นว่าทำไมคำสั่งสำหรับทุกสิ่งที่ลบในไดเรกทอรีคือ ทำไมไม่มีธงทำเช่นเดียวกันกับrmdir? มันจะไม่ใช้งานง่ายกว่าrmdirสำหรับการดำเนินการไดเรกทอรีหรือไม่
13 shell  files  directory 

3
จะเข้าใจคำสั่ง“ cat> file_name << blah” ได้อย่างไร?
ในคำสั่งต่อไป cat ใช้เนื้อหาของ here-doc และเปลี่ยนเส้นทางไปยังไฟล์ conf: cat &gt; conf &lt;&lt; EOF var1="cat" var2="dog" var3="hamster" EOF จะเข้าใจลำดับของคำสั่งได้อย่างไร bashขั้นตอนแรกจะประมวลผลทุกอย่าง (ที่นี่ส่วน doc) และเป็นขั้นตอนสุดท้ายมันดู&gt; confส่วนหรือไม่

6
การแยกไฟล์. gz ที่อยู่ในโฟลเดอร์
ฉันมีโฟลเดอร์ที่มีไฟล์. pdb.gz ประมาณ 320116 ฉันต้องการที่จะบีบอัดพวกเขาทั้งหมด ถ้าฉันใช้ gunzip * .gz มันทำให้ฉันมีข้อผิดพลาดคือรายการอาร์กิวเมนต์ยาวเกินไป โฟลเดอร์มีขนาดประมาณ 2GB โปรดให้คำแนะนำที่เหมาะสมแก่ฉัน
13 shell 

4
ฉันจะแทนที่ bash ด้วย Python ได้อย่างไร
ตามที่ได้รับการยอมรับคำตอบสำหรับคำถามนี้ SO: งูหลามสามารถสร้างทดแทนทุบตีที่ดี คำถามของฉันคือ: ฉันจะเปลี่ยนสวิตช์ได้อย่างไร? ฉันคิดว่าสิ่งสำคัญในการเรียงลำดับเพื่อให้สวิตช์เป็นเช่น: เมื่อเริ่มต้นเทอร์มินัลเสมือนโทรหา Python shell (จะเป็นอย่างไร) แทนที่จะเป็นบอร์นเชลล์ มันสมเหตุสมผลไหม ถ้าใช่ฉันจะทำสิ่งนั้นได้อย่างไร การเปรียบเทียบวิกิพีเดียของเชลล์ทั่วไปไม่ได้แสดงรายการ Python เชลล์เดี่ยว: การเปรียบเทียบเชลล์คำสั่ง
13 shell  python 

2
ตัวแปรใช้“ ~” สำหรับ cd'ing ได้อย่างไร
ฉันจะใช้ตัวแปร - $BASEในซีดีของฉันได้อย่างไร ฉันลองสิ่งต่อไปนี้ แต่ฉันได้รับข้อผิดพลาด $ cd ~/z/repo_1_ruby_193/ 23:23:57 durrantm Castle2012 /home/durrantm/z/repo_1_ruby_193 $ BASE="~/z" 23:24:03 durrantm Castle2012 /home/durrantm/z/repo_1_ruby_193 $ cd $BASE/repo_1_ruby_193 -bash: cd: ~/z/repo_1_ruby_193: No such file or directory 23:24:25 durrantm Castle2012 /home/durrantm/z/repo_1_ruby_193

9
เครื่องมือบรรทัดคำสั่งเพื่อ“ cat” การขยายแบบคู่ของแถวทั้งหมดในไฟล์
สมมติว่าฉันมีไฟล์ (เรียกว่า sample.txt) ที่มีลักษณะดังนี้: Row1,10 Row2,20 Row3,30 Row4,40 ฉันต้องการที่จะทำงานกับสตรีมจากไฟล์นี้ซึ่งเป็นการรวมกันแบบคู่ของทั้งสี่แถว (ดังนั้นเราควรจะจบด้วย 16 ทั้งหมด) ตัวอย่างเช่นฉันกำลังมองหาคำสั่งสตรีม (เช่นมีประสิทธิภาพ) โดยที่เอาต์พุตคือ: Row1,10 Row1,10 Row1,10 Row2,20 Row1,10 Row3,30 Row1,10 Row4,40 Row2,20 Row1,10 Row1,20 Row2,20 ... Row4,40 Row4,40 กรณีการใช้งานของฉันคือฉันต้องการสตรีมเอาต์พุตนี้ไปยังคำสั่งอื่น (เช่น awk) เพื่อคำนวณเมทริกบางส่วนเกี่ยวกับชุดค่าผสมแบบคู่นี้ ฉันมีวิธีที่จะทำสิ่งนี้ใน awk แต่ข้อกังวลของฉันคือการใช้บล็อก END {} ของฉันหมายความว่าฉันกำลังเก็บไฟล์ทั้งหมดไว้ในหน่วยความจำก่อนส่งออก รหัสตัวอย่าง: awk '{arr[$1]=$1} END{for (a in arr){ for (a2 in …

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