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

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

4
ค้นหาชุดของไฟล์ทั่วไประหว่างหลายไดเรกทอรี?
ฉันกำลังมองหาเพื่อเปรียบเทียบไดเรกทอรีของชุดรูปแบบ Drupal ชุดรูปแบบ drupal เป็นไดเรกทอรีที่ประกอบด้วยไฟล์หลายไฟล์และฉันพยายามที่จะหาว่าไฟล์ใดที่จำเป็น ตัวอย่างเช่นพวกเขาทั้งหมดอาจมีไฟล์ที่เรียกว่าหรือtemplate.phppage.tpl.php ฉันจะค้นหาชุดของไฟล์ทั่วไปทั้งหมดสำหรับหลายไดเรกทอรีได้อย่างไร ในกรณีของฉันไฟล์ 'เดียวกัน' ทั้งหมด (ชื่อเดียวกัน) จะอยู่ในไดเรกทอรีระดับเดียวกัน
9 shell 

8
ลบไฟล์ที่เก่าที่สุด
ฉันกำลังพยายามลบไฟล์เก่าออกจากไดเรกทอรีและเหลือเพียง 3 ไฟล์ใหม่ล่าสุด cd /home/user1/test while [ `ls -lAR | grep ^- | wc -l` < 3 ] ; do rm `ls -t1 /home/user/test | tail -1` echo " - - - " done มีบางอย่างผิดปกติกับข้อความสั่งแบบมีเงื่อนไข
9 shell  files  rm 

1
สองท่อต่อหนึ่งคำสั่ง
ฉันสับสนเล็กน้อยตามไวยากรณ์ต่อไปนี้ แม้ว่ามันจะใช้งานได้ แต่ก็ไม่เข้าใจว่าทำไมมันถึงได้ผล ดูเหมือนว่ามีสองท่อที่ต่ออยู่กับคำสั่ง diff แต่ไม่มีเพียงอันเดียวSTDINใช่ไหม ตัวอย่าง: diff <(echo "foobar") <(echo "barbaz") diff <(cat foo.txt) <(cat bar.txt)
9 bash  shell 

1
วิธีการตรวจสอบเมื่อเชลล์เป็นเจ้าของโดยเซสชั่น SSH ระยะไกล?
คำถามของฉันคล้ายกับคำถามนี้แต่ฉันกำลังมองหาบางอย่างที่แตกต่างออกไปเล็กน้อย ฉันมีโน้ตบุ๊คพีซีที่ฉันใช้เพื่อเข้าถึงเครื่อง Linux บนเครือข่ายในสองสถานการณ์ที่แตกต่างกัน: ฉันมีการเชื่อมต่อแบบใช้สายโดยตรงกับเครือข่าย ฉันมีการเชื่อมต่อทางอ้อมกับเครือข่าย มีเครื่องเกตเวย์บนเครือข่ายที่เปิดรับกับอินเทอร์เน็ตซึ่งฉันสามารถใช้เพื่อสร้างอุโมงค์ SSH ไปยังโฮสต์บนเครือข่ายได้ เห็นได้ชัดว่านี่คือการเชื่อมต่อที่ช้ากว่าและมีความหน่วงสูงกว่ามาก .bashrcไดเรกทอรีบ้านของฉันคือเครือข่ายที่สามารถเข้าถึงได้จากทุกเครื่องเพื่อให้พวกเขาแบ่งปันสำเนาของฉัน ฉันต้องการเพิ่มฟังก์ชันการทำงานเพื่อ.bashrcตรวจสอบว่าฉันอยู่ในสถานการณ์ใดในสองสถานการณ์ (โดยทางเทคนิคจะมีสามสถานการณ์โดยที่สามคือที่ฉันเข้าสู่เครื่องท้องถิ่นของฉัน แต่ควรจัดการได้อย่างง่ายดาย ) ฉันต้องการทำสิ่งต่าง ๆ เช่น: alias ssh ssh -X เมื่อฉันอยู่ในเครือข่ายท้องถิ่น แต่ฉันไม่ต้องการใช้การส่งต่อ X ผ่านอินเทอร์เน็ต export EDITOR=gvimเมื่อฉันอยู่ในเครือข่ายท้องถิ่น แต่export EDITOR=vimเมื่อฉันระยะไกล และอื่น ๆ จากคำตอบก่อนหน้าดูเหมือนว่าฉันควรจะสามารถทำสิ่งนี้ได้โดยการตรวจสอบเนื้อหาของSSH_CLIENT(ถ้ามี) และดูว่าที่อยู่ IP ของไคลเอ็นต์ตรงกับหนึ่งในอะแดปเตอร์เครือข่ายในเครื่องท้องถิ่นของฉัน ฉันคิดว่าฉันจะดูว่ามีวิธีที่ไม่มั่นคงหรือมีประสิทธิภาพมากกว่านี้หรือไม่
9 shell  ssh  bashrc 



2
เชลล์ไม่เฉพาะเจาะจงอะไร
ภายใต้คำตอบบางอย่างฉันเห็นความคิดเห็นที่แนะนำให้หลีกเลี่ยงคำสั่งเฉพาะของเชลล์ในคำตอบ ฉันจะรู้ได้อย่างไรว่าคำสั่งโอเปอเรเตอร์และอื่น ๆ มีอยู่ในทุกเชลล์? มีรายการมาตรฐานหรือไม่? man builtinsให้รายการคำสั่ง คำสั่งเหล่านั้นเป็นคำสั่งเดียวที่ฉันสามารถใช้ในเชลล์สคริปต์แบบพกพาที่ใช้ได้กับเชลล์ทั้งหมดหรือไม่? ในตัวสามารถเป็นเปลือกเฉพาะ? มาตรฐานสำหรับ Linux แตกต่างจาก Unixes อื่น ๆ หรือไม่? แล้วไวยากรณ์ล่ะ เครื่องหมายวรรคตอนโอเปอเรเตอร์และอื่น ๆ อาจแตกต่างกันในหอยบางตัวหรือไม่?

1
ตรวจสอบว่าผู้ใช้ปัจจุบันมีสิทธิ์เขียนในไดเรกทอรี
ฉันรู้ว่าคุณสามารถกำหนดเจ้าของไดเรกทอรีโดยทำ: ls -ld ~/foo | awk '{ print $3 }' จากนั้นคุณสามารถเปรียบเทียบกับผู้ใช้ปัจจุบันโดยทำสิ่งนี้: if [[ $(ls -ld ~/foo | awk '{ print $3 }') == "$USER" ]] # or $(id -u -n ) instead of $USER then echo "You are the owner" else echo "You are NOT the owner" fi แต่คุณสามารถมีสิทธิ์เขียนโดยไม่ต้องเป็นเจ้าของ คุณทราบได้อย่างไร

1
ยืนยันการออกโดยใช้กับดัก
ฉันพยายามดักCtrl+Cสัญญาณเพื่อขอคำยืนยันจากผู้ใช้ ส่วนการดักจับทำงานได้ดี แต่เมื่อสัญญาณถูกดักจับมันจะไม่กลับสู่การทำงานปกติ แต่จะออกจากสคริปต์แทน วิธีทำให้มันทำงานต่อเมื่อผู้ใช้กดหมายเลข นี่คือรหัสของฉัน hell() { echo "Do you want to quit? Press 1 for yes and 0 for no"; read n; if [ $n == 1 ]; then exit 1; fi } trap "hell" SIGINT find /

6
การเปลี่ยนเส้นทาง IO และคำสั่ง head
ฉันพยายามแก้ไข.hgignoreไฟล์จาก Cygwin bash shell วันนี้อย่างรวดเร็วและฉันเพิ่มบรรทัดที่ผิด ฉันไม่แน่ใจว่านี่เป็นวิธีที่ดีที่สุดหรือไม่ แต่ฉันคิดว่าhead -1 .hgignoreจะลบบรรทัดที่ละเมิดออกไปอย่างรวดเร็ว(ก่อนหน้านี้ฉันเคยมีเพียงหนึ่งบรรทัดในไฟล์) นั่นเองเมื่อดำเนินการแล้วจะให้บรรทัดแรกเป็นเอาต์พุตเท่านั้น แต่เมื่อฉันพยายามเปลี่ยนเส้นทางเอาต์พุตและเขียนไฟล์ใหม่โดยใช้head -1 .hgignore > .hgignoreไฟล์นั้นว่างเปล่า ทำไมสิ่งนี้ถึงเกิดขึ้น หากฉันลองต่อท้ายแทนhead -1 .hgignore >> .hgignoreจะเป็นการต่อท้ายอย่างถูกต้อง แต่นี่ไม่ใช่ผลลัพธ์ที่ต้องการอย่างชัดเจน เหตุใดการเปลี่ยนเส้นทางที่ถูกตัดทอนจึงไม่ทำงานในกรณีนี้

4
เหตุใดฉันจึงไม่สามารถรับค่าทางออกของคำสั่งในสคริปต์ทุบตีนี้
ดังนั้นฉันจึงเขียนสคริปต์เล็ก ๆ น้อย ๆ นี้สำหรับแปลงวิดีโอเป็น mp3: #! /bin/bash -x if [ -z "$1" ] then zenity --warning --text="Error - No file selected !" exit 1 fi BASEFILENAME=${1%.*} exec ffmpeg -i "$1" -ab 256k "$BASEFILENAME.mp3" && if [ "$?" -eq 0 ] then zenity --info --text="Converting successful" exit fi ปัญหาคือแม้ว่าคำสั่ง ffmpeg …
9 shell  exit 

1
การแก้ไขเครื่องหมายดอลลาร์ในเครื่องหมายคำพูดในทุบตี
ฉันใช้งานสคริปต์ทดสอบเล็ก ๆ นี้ที่ฉันเขียน: #!/bin/bash TESTCASE=$@ testHarness <<runTest $TESTCASE runTest จากบรรทัดคำสั่ง: ./test.sh "1092$212" แต่เครื่องหมายดอลลาร์กำลังถูกถอดออก ถ้าฉันหลบหนีมันใช้งานได้ แต่ฉันคิดว่าเครื่องหมายคำพูดคู่จะป้องกันฉันจากการต้องทำสิ่งนี้ ใครช่วยได้โปรดช่วยฉันเข้าใจว่าเกิดอะไรขึ้นและจะแก้ไขได้อย่างไร
9 bash  shell  quoting 

2
วิธีจัดการไฟล์จำนวนมากในเชลล์?
$ ls ./dir_with_huge_amount_of_files/errors/ สมมติว่าไดเรกทอรีเต็มไปด้วยรูปภาพที่มียูนิกซ์ประทับเวลาฉันหมายถึงมีหน่วยวัดเป็นกิกะไบต์หรือมากกว่านั้น คำสั่งเชลล์เช่นlsจะได้รับคำเตือนแบบล้นเนื่องจากไม่ได้ออกแบบมาให้ทำงานกับรูปภาพนับล้าน (หรือมากกว่า) ฉันจะจัดการไฟล์จำนวนมากได้อย่างไร ตัวอย่างเช่นถ้าฉันต้องการค้นหารูปภาพที่อยู่ตรงกลาง (ตามเวลาในชื่อและเวลาสร้าง) มีระบบไฟล์บางส่วนที่มีคุณสมบัติการค้นหาในตัวหรือไม่? คุณจะใช้คำสั่งใด ฉันพยายามอย่างสบายlsและfindด้วยการตั้งค่าสถานะที่จำเป็น แต่พวกเขาก็ช้ามากหรือสร้างคำเตือนดังนั้นฉันคิดว่าฉันต้องการระบบไฟล์หรือ db ที่ดีกว่าหรืออะไรทำนองนั้นเพื่อจัดทำดัชนีรูปภาพ โดยทั่วไปฉันต้องการอาร์เรย์หนึ่งชุดที่จะจัดวางรูปภาพ inodes ตามลำดับเวลา ทำอย่างไร ต่อมาสามารถเพิ่มข้อมูลเมตาที่มียูนิกซ์ - เวลา [Update] มีข้อบกพร่องที่ร้ายแรงในคำตอบปัจจุบันผู้คนเพียงโพสต์เรียงลำดับของคำตอบโดยไม่ต้องทดสอบเชิงประจักษ์ หากพวกเขาทดสอบข้อเสนอแนะของพวกเขาพวกเขาอาจจะล้มเหลว ดังนั้นฉันจึงสร้างเครื่องมือบรรทัดคำสั่งให้คุณซึ่งคุณสามารถสร้างแซนด์บ็อกซ์เพื่อสร้างไฟล์จำนวนมากและทดสอบข้อเสนอแนะของคุณเช่นเดียวกับไฟล์จำนวน 1e7 อาจใช้เวลานานในการสร้างไฟล์ดังนั้นต้องอดทน หากมีคนรู้วิธีที่รวดเร็วกว่านี้โปรดแก้ไขรหัส พิมพ์python code.py --helpเพื่อรับความช่วยเหลือ มีความสุข! ตัวอย่างการใช้งานเพื่อสร้างไฟล์ dirred จำนวนมาก $ ls ./data2 ls: ./data2: No such file or directory $ python testFill.py -n …

3
ทำสองสิ่งด้วยเอาต์พุตจากคำสั่ง
ฉันมีโปรแกรมtexcountที่แสดงจำนวนคำในเอกสาร LaTeX ของฉัน ฉันยังสามารถsedไพพ์ผลลัพธ์ของสิ่งนี้เพื่อสร้างบรรทัดใหม่ของ TeX และเขียนสิ่งนี้ลงในไฟล์ที่ฉันสามารถรวมไว้ในเอกสารสุดท้ายของฉัน แต่เมื่อฉันทำtexcount foo.tex | sed s/$/'\\\\'/ > wc.texเอาต์พุตบรรทัดคำสั่งของtexcountถูกระงับ ฉันจะรับเอาต์พุตของคำสั่งแรกที่จะแสดงในเทอร์มินัลและไพพ์ไปยัง sed ได้อย่างไร?

1
ระบบมีขั้นตอนอะไรบ้างเมื่อจัดการการเชื่อมต่อ SSH
ระบบมีขั้นตอนอะไรบ้างเมื่อจัดการการเชื่อมต่อ SSH เราพยายามเข้าสู่ระบบผ่านทาง ssh sshd เริ่มโมดูล pam และ pam เพื่อตรวจสอบสิทธิ์เรา เราจำเป็นต้องระบุชื่อผู้ใช้และรหัสผ่าน (ตรวจสอบไฟล์passwdและshadowไฟล์) ตรวจสอบ pam สำหรับhosts.allow/deny, /etc/shellsและสิ่งอื่น ๆ หากทุกอย่างเป็นไปได้เราจะเข้าสู่ระบบ ??? เชลล์เริ่มแล้ว ดังนั้นคำถามของฉันคือกลไกใดที่รับผิดชอบในการตรวจสอบว่าเชลล์ใดที่กำหนดให้กับผู้ใช้ในpasswdไฟล์ (ในขั้นตอนที่ 6) มันคือตัวเอง, โมดูลแพsshdมบางอย่าง, หรืออย่างอื่น? ฉันรู้ว่าฉันสามารถแทนที่passwdไฟล์ (สำหรับการตรวจสอบชื่อผู้ใช้และรหัสผ่าน) โดยการเขียนโมดูลแพม แต่ฉันจะแทนที่passwdไฟล์สำหรับรายการเชลล์ได้อย่างไร
9 shell  ssh  pam 

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