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

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

4
find-command สำหรับไดเร็กทอรีย่อยที่แน่นอน
สมมติว่าผมมีไดเรกทอรีdirที่มีสามไดเรกทอรีย่อย..dir1 dir3และข้างในฉันมีไฟล์มากมายและไดเรกทอรีย่อยอื่น ๆ ฉันต้องการค้นหาไฟล์ข้างในพูดด้วย*.cจุดจบ แต่ฉันต้องการค้นหาเฉพาะในไดเรกทอรีย่อย "dir / dir2" และไดเรกทอรีย่อยทั้งหมด ฉันจะกำหนดสิ่งนั้นได้อย่างไร สมมติว่าdir/ฉันมีฉัน: find . -name "*.c" เพื่อค้นหาในทุกไดเรกทอรี ฉันจะ จำกัด เฉพาะได้dir2อย่างไร
17 linux  bash  shell  find 

9
เปลี่ยนรายการเป็นบรรทัดเดียวด้วยตัวคั่น
ฉันต้องจดรายการ (โหลด) ที่อยู่ IP ในรูปแบบนี้: 134.27.128.0 111.245.48.0 109.21.244.0 และแปลงเป็นรูปแบบนี้โดยใช้ไพพ์อยู่ระหว่าง (สร้าง IP) 134.27.128.0 | 111.245.48.0 | 109.21.244.0 | 103.22.200.0/22 ฉันคิดว่ามันเป็นคำสั่งค้นหาและแทนที่sedแต่ฉันไม่สามารถใช้งานได้

3
เครื่องหมายวงเล็บในเงื่อนไข if: เหตุใดฉันจึงได้รับข้อผิดพลาดทางไวยากรณ์โดยไม่มีช่องว่าง
ฉันใช้สคริปต์ด้านล่างเพื่อย้ายสองวันกลับเมื่อสคริปต์ทำงานที่เริ่มต้นสองวันของปีและตรวจสอบวันแรกและวันที่สองของทุกเดือนและย้ายกลับสองวัน if [$month="01"] && [$day="01"]; then date="$last_month/$yes_day/$last_year" fulldate="$last_month/$yes_day/$last_year" else if [$month="01"] && [$day="02"]; then date="$last_month/$yes_day/$last_year" fulldate="$last_month/$yes_day/$last_year" else if [ $day = "01" ]; then date="$last_month/$yes_day/$year" fulldate="$year$last_month$yes_day" else if [ $day = "02" ]; then date="$last_month/$yes_day/$year" fulldate="$year$last_month$yes_day" else date="$month/$yes_day/$year" fulldate="$year$month$yes_day" fi fi fi fi แต่ฉันไม่ดีได้รับข้อความแสดงข้อผิดพลาดด้านล่าง Etime_script.sh: line 19: [06=01]: command not …

2
เริ่ม zsh ด้วย zshrc ที่กำหนดเอง
ฉันต้องการเริ่ม zsh ด้วยไฟล์ rc แบบกำหนดเองที่คล้ายกับคำสั่ง: bash --rc-file /path/to/file หากไม่สามารถทำเช่นนั้นจะสามารถเริ่ม zsh, run source /path/to/fileแล้วยังคงอยู่ในเซสชัน zsh เดียวกันได้หรือไม่ หมายเหตุ: คำสั่งzsh --rcs /path/to/fileไม่ทำงานอย่างน้อยก็ไม่ใช่สำหรับฉัน ... แก้ไข: ครบถ้วนฉันต้องการจะทำสิ่งต่อไปนี้: sshไปยังเซิร์ฟเวอร์ระยะไกล "example.com", รันzsh, sourceการกำหนดค่าของฉันอยู่ที่/path/to/file, ทั้งหมดใน 1 คำสั่ง นี่คือที่ฉันพยายามโดยเฉพาะอย่างยิ่งเพราะฉันไม่อยากเขียนไฟล์การกำหนดค่าใด ๆ บนเครื่องระยะไกล
17 linux  shell  zsh  oh-my-zsh 

3
ดูการเปลี่ยนเส้นทาง STDOUT ของกระบวนการทำงาน
ถ้าฉันเริ่มต้นแอพด้วยคำสั่งนี้: /path/to/my/command >> /var/log/command.log และคำสั่งจะไม่ส่งคืนมีวิธีอื่นจากพรอมต์อื่นหรือไม่เพื่อดูว่าการเปลี่ยนเส้นทาง STDOUT ถูกตั้งค่าเป็นอะไร ฉันกำลังมองหาบางอย่างเช่น cat /proc/PID/redirects หรือ ps -??? | grep PID แต่วิธีการใด ๆ ที่จะทำ


1
ความหมายของ“ <& 3” และ“ Done <file11 3 <file22” คืออะไร
ฉันมีสคริปต์ต่อไปนี้: while read lineA &amp;&amp; read lineB &lt;&amp;3 do echo "$lineA" echo "$lineB" echo done &lt; file11 3&lt; file22 รหัสนี้ใช้งานได้ดี แต่ฉันไม่เข้าใจสิ่งเหล่านี้: &lt;&amp;3 done &lt; file11 3&lt; file22

2
`. []. foo []` ทำอะไรด้วยการทุบตี? ทำไมมันตรงกับ `.. '
ดูที่ต่อไปนี้: $ echo .[].aliases[] .. $ echo .[].foo[] .. $ echo .[].[] .. $ echo .[].xyz[] .. $ echo .xyz[].xyz[] .xyz[].xyz[] $ echo .xyz[].[] .xyz[].[] เห็นได้ชัดว่านี่ดูเหมือนจะมีบางสิ่งบางอย่าง แต่ฉันไม่เข้าใจว่าผลลัพธ์มารวมกันได้อย่างไร จากความเข้าใจของฉัน[]เป็นคลาสตัวละครที่ว่างเปล่า มันจะง่ายถ้า มันจับคู่เฉพาะสตริงว่าง ในกรณีนี้ฉันคาดหวังว่า bash จะทำซ้ำทั้งหมดเนื่องจากไม่มีสิ่งใดตรงกับในไดเรกทอรีนี้ แต่ยังจับคู่สิ่งต่าง ๆ เช่น..aliases(ในตัวอย่างแรก) หรือไม่มีอะไรเลย ในกรณีนี้ฉันคาดหวังว่า bash จะทำซ้ำสตริงทั้งหมด นี่คือกับ GNU bash, รุ่น 4.4.23 (1) - ปล่อย
16 bash  shell  wildcards 


6
เลือกล่ามหลังจากเริ่มต้นสคริปต์เช่นถ้า / else อยู่ใน hashbang
มีวิธีใดบ้างในการเลือกล่ามที่กำลังเรียกใช้สคริปต์แบบไดนามิก ฉันมีสคริปต์ที่ฉันใช้ในระบบที่แตกต่างกันสองระบบและล่ามที่ฉันต้องการใช้นั้นจะอยู่ในตำแหน่งที่ตั้งที่ต่างกันในทั้งสองระบบ สิ่งที่ฉันต้องทำคือเปลี่ยนสาย hashbang ทุกครั้งที่เปลี่ยนไป ฉันต้องการทำบางสิ่งที่เทียบเท่ากับตรรกะของสิ่งนี้ (ฉันรู้ว่าการสร้างที่แน่นอนนี้เป็นไปไม่ได้): if running on system A: #!/path/to/python/on/systemA elif running on system B: #!/path/on/systemB #Rest of script goes here หรือจะดีกว่านี้ก็เพื่อให้พยายามใช้ล่ามตัวแรกและหากไม่พบมันจะใช้ตัวที่สอง: try: #!/path/to/python/on/systemA except: #!path/on/systemB #Rest of script goes here เห็นได้ชัดว่าผมแทนสามารถดำเนินการได้เป็น /path/to/python/on/systemA myscript.py หรือ /path/on/systemB myscript.py ขึ้นอยู่กับที่ผม แต่ที่จริงผมมีสคริปต์เสื้อคลุมที่เปิดตัวmyscript.pyดังนั้นผมอยากจะระบุเส้นทางไปล่ามหลามทางโปรแกรมมากกว่าด้วยมือ

6
วิธีที่เร็วและมีประสิทธิภาพที่สุดในการรับจำนวนเรคคอร์ด (บรรทัด) ในไฟล์บีบอัด gzip
ฉันพยายามที่จะทำบันทึกนับในไฟล์ 7.6 GB gzip ฉันพบวิธีการเล็กน้อยโดยใช้zcatคำสั่ง $ zcat T.csv.gz | wc -l 423668947 วิธีนี้ใช้งานได้ แต่ใช้เวลานานเกินไป (มากกว่า 10 นาทีในการนับ) ฉันลองวิธีอื่นอีกสองสามอย่างเช่น $ sed -n '$=' T.csv.gz 28173811 $ perl -lne 'END { print $. }' &lt; T.csv.gz 28173811 $ awk 'END {print NR}' T.csv.gz 28173811 ทั้งสามคำสั่งเหล่านี้กำลังดำเนินการอย่างรวดเร็ว แต่ให้นับไม่ถูกต้องของ 28173811 ฉันจะนับจำนวนเร็กคอร์ดในเวลาน้อยที่สุดได้อย่างไร
16 shell  gzip 

4
ความแตกต่างในการใช้งานระหว่างตัวแปรเชลล์และตัวแปรสภาพแวดล้อมคืออะไร?
จริง ๆ แล้วฉันไม่รู้ว่ามีตัวแปรสองประเภทที่ฉันสามารถเข้าถึงได้จากบรรทัดคำสั่ง ทั้งหมดที่ฉันรู้คือว่าฉันสามารถประกาศตัวแปรเช่น: foo="my dear friends" bar[0]="one" bar[1]="two" bar[2]="three" หรือเข้าถึงพวกเขาด้วยเครื่องหมาย $ เช่น: echo $foo echo ${bar[1]} หรือใช้ตัวแปร inbuilt เช่น: echo $PWD PATH=$PATH:"/usr/bin/myProg" ตอนนี้ฉันได้ยินมาว่ามีตัวแปรสองประเภท (อย่างน้อย?) ตัวแปร: ตัวแปรเชลล์และตัวแปรสภาพแวดล้อม วัตถุประสงค์ของการมีสองประเภทที่แตกต่างกันคืออะไร? ฉันจะรู้ได้อย่างไรว่าตัวแปรประเภทใด ประเพณีทั่วไปสำหรับแต่ละคนมีอะไรบ้าง



3
วิธีการแปลงอิโมติคอนที่ระบุโดยรหัส U + xxxxx เป็น utf-8
อิโมติคอนดูเหมือนจะถูกระบุโดยใช้รูปแบบของ U + xxxxx โดยที่แต่ละ x เป็นเลขฐานสิบหก ตัวอย่างเช่นU + 1F615เป็นรหัส Unicode Consortium อย่างเป็นทางการสำหรับ "สับสนใบหน้า" 😕 เมื่อฉันสับสนบ่อยฉันมีความสัมพันธ์ที่ดีต่อสัญลักษณ์นี้ การแทนU + 1F615ทำให้ฉันสับสนเพราะฉันคิดว่าการเข้ารหัสที่เป็นไปได้สำหรับอักขระ Unicode ต้องใช้ 8, 16, 24 หรือ 32 บิตในขณะที่ 5 หลักเลขฐานสิบต้องมี 5x4 = 20 บิต ฉันได้ค้นพบว่าสัญลักษณ์นี้น่าจะเป็นสตริงเลขฐานสิบหกที่แตกต่างกันโดยสิ้นเชิงใน bash: $echo -n 😕 | hexdump 0000000 f0 9f 98 95 0000004 $echo -e "\xf0\x9f\x98\x95" 😕 …

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