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

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


13
ทรัพยากรที่มีประสิทธิภาพมากที่สุดในการนับจำนวนไฟล์ในไดเรกทอรีคืออะไร?
CentOS 5.9 ฉันเจอปัญหาเมื่อวันก่อนที่ไดเรกทอรีมีไฟล์จำนวนมาก เมื่อต้องการนับฉันวิ่งls -l /foo/foo2/ | wc -l ปรากฎว่ามีมากกว่า 1 ล้านไฟล์ในไดเรกทอรีเดียว (เรื่องยาว - สาเหตุที่แท้จริงได้รับการแก้ไข) คำถามของฉันคือ: มีวิธีที่เร็วกว่าในการนับหรือไม่ อะไรจะเป็นวิธีที่มีประสิทธิภาพที่สุดในการนับ?
55 bash  shell  directory  ls 

5
การต่อท้ายวันที่ปัจจุบันจากตัวแปรไปยังชื่อไฟล์
ฉันพยายามต่อท้ายวันที่ปัจจุบันต่อท้ายชื่อไฟล์ดังนี้: TheFile.log.2012-02-11 นี่คือสิ่งที่ฉันมี: set today = 'date +%Y' mkdir -p The_Logs & find . -name The_Logs -atime -1 -type d -exec mv \{} "The_Logs_+$today" \; & อย่างไรก็ตามสิ่งที่ฉันได้รับคือชื่อของไฟล์และจะไม่มีการต่อท้าย ฉันจะต่อท้ายวันที่ปัจจุบันกับชื่อไฟล์ได้อย่างไร
55 bash  shell  rename  date 

10
วิธีการ rsync ไฟล์ระหว่างรีโมทสองรีโมท?
ฉันต้องการถ่ายโอนไฟล์ระหว่างสองรีโมตโฮสต์โดยใช้บนโลคัลเชลล์ แต่ดูเหมือนว่า rsync ไม่สนับสนุนการซิงโครไนซ์หากมีการระบุรีโมตสองรายการดังนี้: $ rsync -vuar host1:/var/www host2:/var/www The source and destination cannot both be remote. วิธีแก้ปัญหา / คำสั่งอื่นใดที่ฉันสามารถใช้เพื่อให้ได้ผลลัพธ์ที่คล้ายกัน
54 shell  ssh  rsync 

6
วิธีคัดลอกไฟล์บางไฟล์ แต่ไม่ใช่ทั้งหมด?
ดังนั้นคุณสามารถใช้*เป็นบัตรเสริมสำหรับไฟล์ทั้งหมดเมื่อใช้cpภายในบริบทของไดเรกทอรี มีวิธีการคัดลอกไฟล์ทั้งหมดยกเว้นxไฟล์หรือไม่
54 bash  shell  wildcards 

8
ย้าย `rm` ไปที่ถังขยะ
มี Linux สคริปต์ / แอปพลิเคชันซึ่งแทนที่จะลบไฟล์ย้ายพวกเขาไปยังตำแหน่ง "ขยะ" พิเศษหรือไม่? ฉันต้องการสิ่งนี้แทนrm(อาจเป็นนามแฝงหลังมีข้อดีและข้อเสียสำหรับการที่) โดย“ ถังขยะ” ฉันหมายถึงโฟลเดอร์พิเศษ เดียวmv $* ~/.trashเป็นขั้นตอนแรก แต่นึกคิดนี้ควรจัดการ trashing หลายไฟล์ที่มีชื่อเดียวกันโดยไม่เขียนทับไฟล์ถังขยะเก่าและอนุญาตให้มีการเรียกคืนไฟล์ไปยังตำแหน่งเดิมของพวกเขาด้วยคำสั่งง่ายๆ (ชนิดของ“ยกเลิก”) ยิ่งไปกว่านั้นมันจะดีถ้าถังขยะถูกรีบูทโดยอัตโนมัติเมื่อรีบูท (หรือกลไกที่คล้ายกันเพื่อป้องกันการเติบโตไม่สิ้นสุด) โซลูชันบางส่วนสำหรับสิ่งนี้มีอยู่จริง แต่การกระทำ“ คืนค่า” โดยเฉพาะนั้นไม่สำคัญ มีโซลูชันที่มีอยู่สำหรับสิ่งนี้ซึ่งไม่พึ่งพาระบบถังขยะจากเชลล์กราฟิกหรือไม่? (นอกเหนือจากนี้มีการพูดคุยกันอย่างไม่รู้จบไม่ว่าจะเป็นวิธีการที่เป็นธรรมมากกว่าการใช้การสำรองข้อมูลบ่อยครั้งและ VCS ในขณะที่การสนทนาเหล่านั้นมีประเด็นผมเชื่อว่ายังคงมีช่องสำหรับคำขอของฉัน)
54 shell  rm 

2
เทียบเท่าบรรทัดคำสั่ง 'น้อย' ของ 'tail -f'
tail -fฉันต้องการที่จะเปิดไฟล์โดยใช้น้อยลงและมีมันโดยอัตโนมัติเลื่อนไฟล์คล้ายกับ ฉันรู้ว่าฉันสามารถทำless fileแล้วกดShift-Fเพื่อส่งต่อไปตลอดกาล; tail -fเช่น ฉันต้องการlessเพราะมันให้--raw-control-charsธงซึ่งเป็นสิ่งจำเป็นเพราะอินพุตของฉันมีสีสัน
54 shell  less  tail 

3
ฉันจะทำให้ตัวแปรสภาพแวดล้อม“ ส่งออก” ใน shell script ติดรอบได้อย่างไร
ฉันมีบัญชี Amazon EC2 หลายบัญชีและต้องการเปลี่ยนตัวแปรอย่างรวดเร็วเช่นการ$EC2_HOMEใช้สคริปต์ ฉันได้ตั้งค่าสคริปต์เชลล์เช่นนี้: #!/bin/sh export EC2_HOME=/home/me/.ec2 echo $EC2_HOME เมื่อฉันเรียกใช้สคริปต์ฉันรู้ว่าEC2_HOMEมีการตั้งค่า แต่ฉันคิดว่าการใช้exportจะทำให้ตัวแปรติดรอบหลังจากสคริปต์เสร็จสมบูรณ์ มันไม่ได้ทำงานเหมือนecho $EC_HOMEไม่แสดงอะไรเลย ฉันรู้ว่านี่ต้องเป็นความรู้พื้นฐานเกี่ยวกับการเขียนสคริปต์ Linux แต่ฉันไม่รู้ ฉันพยายามหาคำถามที่เกี่ยวข้องโดยไม่มีโชค - ดังนั้นฉันจึงขอโทษถ้ามันซ้ำกัน

4
ทำไมเครื่องหมายตัวหนอน (~) ไม่ขยายภายในเครื่องหมายคำพูดคู่
ตามคำตอบนี้และความเข้าใจของฉันเอง tilde ขยายไปยังโฮมไดเร็กตอรี่: $ echo ~ /home/braiam ตอนนี้เมื่อใดก็ตามที่ฉันต้องการให้ส่วนขยายของเชลล์ทำงานเช่นใช้ชื่อตัวแปรเช่น$FOOนี้และไม่ทำลายอักขระที่ไม่คาดคิดเนื่องจากช่องว่างและอื่น ๆ เราควรใช้เครื่องหมายคำพูดคู่": $ FOO="some string with spaces" $ BAR="echo $FOO" $ echo $BAR echo some string with spaces ทำไมการขยายตัวนี้จึงใช้งานไม่ได้กับเครื่องหมายตัวหนอน $ echo ~/some/path /home/braiam/some/path $ echo "~/some/path" ~/some/path
54 shell 

5
วิธีการทำคำสั่ง if จากผลลัพธ์ของคำสั่งที่เรียกใช้งาน
ฉันกำลังพยายามทำคำสั่ง IF จากผลลัพธ์ของคำสั่งที่เรียกใช้งาน นี่คือวิธีที่ฉันพยายามทำ แต่ไม่ได้ผล ไม่มีใครรู้วิธีที่ถูกต้องในการทำเช่นนี้? if [ "`netstat -lnp | grep ':8080'`" == *java* ]; then echo "Found a Tomcat!" fi

4
อักขระตัวแทน Bash star * จะสร้างรายการเรียงลำดับ (จากน้อยไปหามาก) เสมอหรือไม่
ฉันมีไดเรกทอรีที่เต็มไปด้วยไฟล์ที่มีชื่ออย่างlogXXที่ XX เป็นเลขฐานสองตัวอักขระสองตัวไม่มีเลขศูนย์ตัวพิมพ์ใหญ่เช่น: log00 log01 log02 ... log0A log0B log0C ... log4E log4F log50 ... โดยทั่วไปจะมีจำนวนไฟล์รวมน้อยกว่า 20 หรือ 30 ไฟล์ วันที่และเวลาในระบบของฉันไม่ใช่สิ่งที่สามารถพึ่งพาได้ (ระบบฝังตัวที่ไม่มีแหล่งเวลา NTP หรือ GPS ที่เชื่อถือได้) อย่างไรก็ตามชื่อไฟล์จะเพิ่มขึ้นอย่างน่าเชื่อถือดังที่แสดงไว้ด้านบน ฉันต้องการgrepผ่านไฟล์ทั้งหมดสำหรับรายการบันทึกล่าสุดบางประเภทฉันหวังว่าจะcatรวมไฟล์เข้าด้วยกันเช่น ... cat /tmp/logs/log* | grep 'WARNING 07 -' | tail -n1 แต่มันเกิดขึ้นกับผมว่ารุ่นที่แตกต่างกันของbashหรือshหรือzshอื่น ๆ อาจจะมีความคิดที่แตกต่างกันเกี่ยวกับวิธีการที่*จะขยายตัว man bashหน้าไม่ได้บอกหรือไม่ว่าการขยายตัวของ*จะเป็นรายชื่อเรียงตามตัวอักษรแน่นอนขึ้นชื่อไฟล์ที่ตรงกัน ดูเหมือนว่าจะเพิ่มขึ้นทุกครั้งที่ฉันลองใช้กับระบบทั้งหมดที่ฉันมีให้ - แต่มันเป็นพฤติกรรมที่กำหนดไว้หรือเพียงแค่การนำไปใช้งานโดยเฉพาะ กล่าวอีกนัยหนึ่งฉันสามารถพึ่งพาcat /tmp/logs/log*การเชื่อมต่อไฟล์บันทึกทั้งหมดของฉันด้วยกันตามลำดับตัวอักษรได้หรือไม่?
53 bash  shell  wildcards 

6
มีเหตุผลใดบ้างที่จะต้องมี shebang ชี้ไปที่ / bin / sh แทนที่จะเป็น / bin / bash?
ในส่วนเชลล์สคริปต์ที่ผมเคยเห็น (นอกเหนือจากคนที่ฉันไม่ได้เขียนตัวเอง) ผมสังเกตเห็นว่า shebang #!/bin/shมีการตั้งค่า นี่ไม่ได้ทำให้ฉันแปลกใจกับสคริปต์เก่า ๆ แต่มันก็มีสคริปต์ใหม่ ๆ มีเหตุผลในการเลือก/bin/shมากกว่า/bin/bashเนื่องจากbashแพร่หลายมากและมักจะเริ่มต้นในเครื่อง Linux และ BSD จำนวนมากจะกลับมาดีกว่าทศวรรษ?
53 bash  shell  history  shebang 

1
'rm. *' เคยลบไดเรกทอรีหลักหรือไม่
นิพจน์.*ถูกขยายโดย bash เพื่อรวมไดเรกทอรีปัจจุบันและพาเรนต์: $ ls -la total 2600 drwxrwxrwx 2 terdon terdon 2162688 Sep 10 16:22 . drwxr-xr-x 142 terdon terdon 491520 Sep 10 15:34 .. -rw-r--r-- 1 terdon terdon 0 Sep 10 16:22 foo $ echo .* . .. ถ้าฉันใช้rm -rf .*Debian โดยใช้ GNU bash version 4.2.36(1)-releaseและrmจากrm (GNU coreutils) …
53 shell  wildcards  rm  posix 

7
หมดเวลาในเชลล์สคริปต์
ฉันมีสคริปต์เชลล์ที่อ่านจากอินพุตมาตรฐาน ในกรณีที่หายากจะมีไม่มีใครพร้อมที่จะให้การป้อนข้อมูลและสคริปต์ที่ต้องหมดเวลา ในกรณีที่หมดเวลาสคริปต์จะต้องเรียกใช้โค้ดการล้างข้อมูล วิธีที่ดีที่สุดในการทำเช่นนั้นคืออะไร? สคริปต์นี้ต้องพกพาได้มากรวมถึงระบบยูนิกซ์ในศตวรรษที่ 20 ที่ไม่มีคอมไพเลอร์ C และอุปกรณ์ฝังตัวที่ใช้งานอยู่ในขณะนี้ดังนั้น Perl, ทุบตี, ภาษาใด ๆ ที่คอมไพล์และแม้แต่ POSIX.2 แบบเต็มไม่สามารถพึ่งพาได้ โดยเฉพาะอย่างยิ่ง$PPID, read -tและกับดักที่ดีเลิศ POSIX สอดคล้องไม่สามารถใช้ได้ การเขียนไปยังไฟล์ชั่วคราวจะถูกแยกออกเช่นกัน สคริปต์อาจทำงานแม้ว่าระบบไฟล์ทั้งหมดจะถูกเมาท์แบบอ่านอย่างเดียว เพียงเพื่อทำให้สิ่งต่าง ๆ ยากขึ้นฉันยังต้องการให้สคริปต์มีความรวดเร็วพอสมควรเมื่อไม่ได้หมดเวลา โดยเฉพาะอย่างยิ่งฉันยังใช้สคริปต์ใน Windows (ส่วนใหญ่ใน Cygwin) โดยที่ fork และ exec มีระดับต่ำโดยเฉพาะดังนั้นฉันจึงต้องการใช้ให้น้อยที่สุด โดยสรุปฉันมี trap cleanup 1 2 3 15 foo=`cat` และฉันต้องการเพิ่มการหมดเวลา ฉันไม่สามารถแทนที่catด้วยในreadตัว ในกรณีที่หมดเวลาฉันต้องการใช้งานcleanupฟังก์ชั่น พื้นหลัง: สคริปต์นี้คาดเดาการเข้ารหัสของเครื่องโดยพิมพ์อักขระ 8 บิตและเปรียบเทียบตำแหน่งเคอร์เซอร์ก่อนและหลัง …
53 shell  signals  timeout 

2
การแทนที่ตัวแปรเฉพาะด้วย envsubst
ฉันพยายามเปลี่ยนตัวแปรสภาพแวดล้อมผ่านenvsubstแต่ฉันต้องการแทนที่ตัวแปรเฉพาะเท่านั้น จากเอกสารฉันควรบอกenvsubstให้เปลี่ยนเฉพาะตัวแปรบางตัวเท่านั้น แต่ฉันไม่สามารถทำเช่นนั้นได้ ตัวอย่างเช่นถ้าฉันมีไฟล์ที่มี: VAR_1=${VAR_1} VAR_2=${VAR_2} ฉันจะดำเนินการอย่างไรenvsubstเพื่อที่จะแทนที่การอ้างอิงถึง${VAR_1}เท่านั้น

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