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

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

12
วิธีการจัดเก็บและเข้าถึงคำสั่งที่ใช้บ่อยอย่างรวดเร็ว?
ฉันมีคำสั่งจำนวนมากที่ฉันต้องเรียกใช้งานเป็นประจำบ่อยครั้งที่มีความแปรปรวนน้อยที่สุด ตอนนี้ฉันกำลังเก็บพวกมันทั้งหมด.bash_historyและใช้CTRL- Rเพื่อเข้าถึงพวกเขา แต่ฉันสงสัยว่ามีวิธีที่ดีกว่านี้ไหม สิ่งที่ฉันกำลังมองหา: ง่ายต่อการเพิ่มคำสั่งใหม่ ง่ายต่อการค้นหาและดำเนินการคำสั่งที่ต้องการอีกครั้ง หลีกเลี่ยงคำสั่งที่ไม่ต้องการในคำแนะนำ แต่น่าเสียดายที่ Bash_history ไม่เป็นเช่นนั้นที่แข็งแกร่งในความต้องการที่สาม: ถ้าผมทำไม่กี่cdและlsก็เติมแฟ้มประวัติได้อย่างรวดเร็ว ฉันเพิ่งเรียนรู้เกี่ยวกับHIST_SIZEและคุณสามารถกำหนดค่าประวัติเพื่อหลีกเลี่ยงการทำซ้ำหรือคำสั่งบางอย่าง แต่ก่อนที่จะกำหนดค่าทั้งหมดที่ฉันต้องการเพื่อให้แน่ใจว่ามันเป็นวิธีที่ดีที่สุด

2
EOF ที่ไม่คาดคิดขณะค้นหาการจับคู่ `" '- สคริปต์ทุบตี
ฉันเพิ่งเขียนสคริปต์ bash และรับ EOF-Error นี้เสมอ ดังนั้นนี่คือสคริปต์ของฉัน (ใช้ได้กับ OS X เท่านั้น): #!/bin/bash #DEFINITIONS BEGIN en_sq() { echo -e "Enabling smart quotes..." defaults write NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool true status=$(defaults read NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool) if [ "$status" = "1" ] then echo -e "Success! Smart quotes are now enabled." SUCCESS="TRUE" else echo -e …
37 bash  shell 

1
สัญลักษณ์ @ (at) หน้าชื่อไฟล์หมายถึงอะไรในคำสั่ง curl
ฉันกำลังดูตัวอย่างของcurlคำสั่งที่ใช้สัญลักษณ์ @ หน้าชื่อไฟล์เพื่อโพสต์ข้อมูลไปยังเซิร์ฟเวอร์ curl http://localhost/ --data-binary @file.txt สิ่งนี้หมายความว่า? มันแทรกเนื้อหาของไฟล์ลงในคำสั่งหรือไม่? มันเฉพาะเจาะจงcurlหรือไม่
37 shell  curl 

2
มีเหตุผลหรือไม่ที่ ls ไม่มีตัวเลือก --zero หรือ -0
คำถามนี้ได้รับแจ้งจากคำถามเกี่ยวกับls' ตัวเลือกและแนวโน้มที่เกิดขึ้นของคนที่จะถามคำถามและคำตอบที่มีการประมวลผลการส่งออกของ-1ls การใช้งานเอาต์พุตนี้lsดูเหมือนจะเข้าใจได้เช่น: หากคุณรู้วิธีเรียงลำดับรายการไฟล์ด้วยlsคุณอาจต้องการใช้ผลลัพธ์ในลักษณะนั้นเป็นอินพุตสำหรับอย่างอื่น หากคำถาม & คำตอบเหล่านั้นไม่ได้มีการอ้างอิงไปยังรายการชื่อไฟล์ที่สร้างขึ้นซึ่งประกอบด้วยชื่อไฟล์ที่ประพฤติดี (ไม่มีอักขระพิเศษเช่นช่องว่างและการขึ้นบรรทัดใหม่) พวกเขามักถูกวิจารณ์โดยบางคนที่ชี้ให้เห็นถึงอันตรายของลำดับคำสั่ง เป็นไฟล์ที่มีบรรทัดใหม่เว้นวรรคและอื่น ๆ find, sortและสาธารณูปโภคอื่น ๆ ในการแก้ปัญหาของการสื่อสาร "ยาก" ชื่อไฟล์เช่นxargsโดยใช้ตัวเลือกในการแยกชื่อไฟล์ที่มีตัวละคร NUL / ไบต์ซึ่งไม่ได้เป็นตัวละครที่ถูกต้องในชื่อไฟล์ (เพียงคนเดียวที่นอกเหนือไป/?) บน ระบบไฟล์ Unix / Linux ฉันมองไปที่หน้า man สำหรับlsและ output สำหรับls --help(ซึ่งมีตัวเลือกเพิ่มเติมในรายการ) และไม่พบว่าls(จากcoreutils) มีตัวเลือกเพื่อระบุ NUL output ที่แยกออก มันมี-1ตัวเลือกที่สามารถตีความได้ว่า"ชื่อไฟล์เอาต์พุตคั่นด้วยขึ้นบรรทัดใหม่" ) ถาม : มีเหตุผลทางเทคนิคหรือปรัชญาทำไมlsไม่มีตัวเลือก--zeroหรือ-0ที่จะ "ชื่อไฟล์เอาต์พุตคั่นด้วย NUL"? หากคุณทำสิ่งที่ส่งออกเฉพาะชื่อไฟล์ (และไม่ใช้เช่น-l) ที่เหมาะสม: ls -rt -0 …
37 shell  command-line  ls 

5
วิธีการเปลี่ยนชื่อหลาย ๆ ไฟล์โดยใช้การค้นหา
ฉันต้องการเปลี่ยนชื่อหลายไฟล์ (file1 ... filen เป็น file1_renamed ... filen_renamed) โดยใช้คำfindสั่ง command: find . -type f -name 'file*' -exec mv filename='{}' $(basename $filename)_renamed ';' แต่รับข้อผิดพลาดนี้: mv: cannot stat ‘filename=./file1’: No such file or directory สิ่งนี้ไม่ทำงานเพราะชื่อไฟล์จะไม่ถูกตีความว่าเป็นตัวแปรเชลล์
37 shell  find 

1
เราควรใช้อักขระ UTF-8 อย่าง⏰ใน bash / shell script หรือไม่?
รหัสง่าย ๆ ที่นี่ทำงานตามที่คาดไว้ในเครื่องของฉันหากเปิดตัวด้วยbash: function ⏰(){ date } ⏰ มีปัญหาสำหรับคนอื่นที่ใช้สิ่งนี้หรือเป็นสากลหรือไม่? ฉันสงสัยเพราะฉันไม่เคยเห็นอะไรแบบนี้ในซอร์สโค้ดอื่นในตอนนี้ แก้ไข: มีความเป็นไปได้ไม่ จำกัด สามารถใช้เพื่อแยกแยะบทบาทของฟังก์ชันกับการใช้อีโมจิได้อย่างรวดเร็ว A 💣สำหรับบางสิ่งที่สามารถแก้ไขหรือลบไฟล์ได้ a หากอยู่ในระหว่างดำเนินการ📃สำหรับเมนูแบบโต้ตอบ ... ฉันเดาว่าเราควรสร้างมาตรฐานสำหรับสิ่งเหล่านั้น แต่ดูเหมือนจะเป็นแนวคิดที่น่าสนใจ บางทีการสุ่มบรรทัดของอักขระ 5 ~ สามารถช่วยให้เราเข้าใจมากว่ารหัสกำลังทำอะไรอยู่ (แน่นอนเราต้องเรียนรู้วิธีอ่าน) แก้ไขเพิ่มเติม: ฉันให้มันยิง สำหรับตอนนี้ถ้าฉันพับฟังก์ชั่นทั้งหมดของฉันในโปรแกรมแก้ไข (หรือcat myscript.sh|grep function) พวกเขาจะมีลักษณะเช่นนี้ (ยูนิโค้ดของฉันดูดีขึ้นมากgeanyหรือเทอร์มินัลของฉันเมื่อเทียบกับที่นี่) function ⬚_1(){ function ⬚⬚_2(){ function ⬚⬚⬚_📃_D(){ function ⬚⬚⬚⬚_📃_X(){ function ⬚⬚⬚⬚⬚_📃_Y(){ function ⬚⬚⬚⬚⬚⬚_❓_P(){ function ⬚⬚⬚⬚_📃_Z(){ function ⬚⬚⬚⬚⬚_❓_U(){ …
36 bash  shell  unicode 

3
เหตุใดการเปิดไฟล์จึงเร็วกว่าการอ่านเนื้อหาตัวแปร
ในbashสคริปต์ฉันต้องการค่าต่าง ๆ จาก/proc/ไฟล์ จนถึงตอนนี้ฉันมีหลายสิบบรรทัด grepping ไฟล์โดยตรงเช่นนั้น: grep -oP '^MemFree: *\K[0-9]+' /proc/meminfo ในความพยายามที่จะทำให้มีประสิทธิภาพมากขึ้นฉันบันทึกเนื้อหาของไฟล์ไว้ในตัวแปรแล้วทำสิ่งต่อไปนี้: a=$(</proc/meminfo) echo "$a" | grep -oP '^MemFree: *\K[0-9]+' แทนที่จะเปิดไฟล์หลายครั้งควรเปิดเพียงครั้งเดียวและ grep เนื้อหาตัวแปรซึ่งฉันคิดว่าน่าจะเร็วกว่า - แต่อันที่จริงมันช้ากว่า: bash 4.4.19 $ time for i in {1..1000};do grep ^MemFree /proc/meminfo;done >/dev/null real 0m0.803s user 0m0.619s sys 0m0.232s bash 4.4.19 $ a=$(</proc/meminfo) bash 4.4.19 $ …

2
ใช้. sh หรือ. bash extension สำหรับสคริปต์ทุบตี?
(ดูการใช้ #! / bin / sh หรือ #! / bin / bash สำหรับความเข้ากันได้ของ Ubuntu-OSX และใช้งานง่าย & POSIX ) ถ้าฉันต้องการให้สคริปต์ของฉันใช้ bash shell ให้ใช้ส่วนขยาย. bash จริง ๆ แล้วเรียกใช้ bash หรือขึ้นอยู่กับ system config / 1st shebang line หากทั้งคู่มีผล แต่แตกต่างกันซึ่งจะมีความสำคัญกว่ากัน ฉันไม่แน่ใจว่าจะจบสคริปต์ด้วย. sh เพียงแค่ระบุ "shell script" จากนั้นให้บรรทัดแรกเลือก bash shell (เช่น#!/usr/bin/env bash) หรือว่าจะจบด้วยbash (เช่นเดียวกับการตั้งค่าบรรทัด 1) ) …
36 bash  shell  shebang 

6
ฉันจะได้แมตช์แรกจากการขยายไวด์การ์ดได้อย่างไร
เชลล์เช่น Bash และ Zsh ขยาย wildcard เป็นอาร์กิวเมนต์โดยมีอาร์กิวเมนต์มากที่สุดเท่าที่ตรงกับรูปแบบ: $ echo *.txt 1.txt 2.txt 3.txt แต่ถ้าฉันต้องการให้การแข่งขันนัดแรกกลับมาไม่ใช่การแข่งขันทั้งหมด? $ echo *.txt 1.txt ฉันไม่สนใจวิธีแก้ปัญหาเฉพาะเชลล์ แต่ฉันต้องการโซลูชันที่ทำงานร่วมกับช่องว่างในชื่อไฟล์
36 shell  wildcards 

3
วิธีเปลี่ยนเชลล์เริ่มต้นเป็น ZSH - chsh บอกว่า“ เชลล์ไม่ถูกต้อง”
ฉันติดตั้ง ZSH บน VM ของฉันซึ่งฉันรวบรวมจากแหล่งที่มา สถานที่ตั้งของ ZSH คือ/usr/local/bin/zshเมื่อฉันเรียกมันเอาท์พุทchsh -s /usr/local/bin/zsh chsh: /usr/local/bin/zsh is an invalid shellฉันยังลองกับ sudo เช่นกัน ฉันจะเปลี่ยนสิ่งนี้ได้อย่างไร
36 shell  zsh  users  login 

3
ซึ่งเป็นสำนวนในสคริปต์ทุบตีมากขึ้น: `|| true` หรือ `|| `?
ฉันไม่ได้ทำสคริปต์เชลล์มากนักดังนั้นฉันแปลกใจเล็กน้อยเมื่อฉันอ่านเอกสารสำหรับgit submoduleและฉันเห็นไวยากรณ์ที่ใช้ในเอกสารนี้: การส่งคืนที่ไม่เป็นศูนย์จากคำสั่งใน submodule ใด ๆ ทำให้การประมวลผลสิ้นสุดลง สิ่งนี้สามารถแทนที่ได้โดยการเพิ่ม|| :ไปยังจุดสิ้นสุดของคำสั่ง ฉันต้องค้นหาว่า|| :เป็นการจดชวเลขเพื่อบังคับให้ออกคำสั่งให้สำเร็จ || trueเมื่อใดก็ตามที่ฉันเคยที่จะทำให้ประสบความสำเร็จในการออกจากคำสั่งผมใช้ จะ|| :ถือว่าเป็นสำนวนมากขึ้น?
36 bash  shell 

4
ทำไม“ sudo su” ในเชลล์สคริปต์ไม่ทำงานส่วนที่เหลือของสคริปต์เป็นรูท
สคริปต์ตัวอย่างสามารถเป็นด้านล่าง: #!/bin/bash sudo su ls /root เมื่อใช้./test.shในฐานะผู้ใช้ปกติแทนที่จะเรียกใช้lsในฐานะผู้ใช้ขั้นสูงและออกจากระบบจะเปลี่ยนเป็นรูท และเมื่อฉันออกจากระบบจะดำเนินการls /rootในฐานะผู้ใช้ปกติ ใครสามารถบอกฉันเกี่ยวกับกลไกเกี่ยวกับเรื่องนี้ได้บ้าง
36 shell  shell-script  sudo  root  su 

9
เอาท์พุท“ Hollywood-hacker-scene” จากกระสุน
นี่อาจดูเหมือนคำถามแปลก ๆ แต่คุณจะใช้อะไรในการสร้างฉากแฮ็คฮอลลีวู้ดทั่วไป ฉันได้รับคำขอนี้จากเพื่อนและสมองของฉันว่างเปล่า ทั้งหมดที่ฉันคิดได้ก็คือฉาก nmap ทั้งหมดจากภาพยนตร์อย่างThe Matrixและอื่น ๆ แต่สิ่งนี้จะต้องทำบน Mac ด้วย OSX เริ่มต้นซึ่งฉันคิดว่ารสชาติของ * ระวังใช่มั้ย พวกเขาไม่มีอินเทอร์เน็ตดังนั้นการเตรียมเครื่องมือภายนอกจึงไม่เป็นปัญหา ฉันกำลังคิดตามบรรทัดการเขียนเทียบเท่า / var / log / ข้อความไปยังหน้าจออาจ ...
36 shell 

4
ฉันจะลบไฟล์ทั้งหมดที่มีนามสกุลเฉพาะในโฟลเดอร์ใดโฟลเดอร์หนึ่งได้อย่างไร
ถ้าฉันตั้งค่าไดเรกทอรีปัจจุบัน / ทำงาน (นำทางไปใช้มันcd) ไปยังไดเรกทอรีเฉพาะบางประเภทแล้วพิมพ์: rm *.xvg คำสั่งนี้จะทำอะไร? มันเป็นความจริงว่าคำสั่งดังกล่าวจะเพียงลบไฟล์ที่มีนามสกุล.xvg เฉพาะในไดเรกทอรีการทำงานหรือไม่ ฉันกังวลเกี่ยวกับการลองก่อนที่จะถามเพราะฉันต้องการให้แน่ใจว่าคำสั่งดังกล่าวจะลบ.xvgไฟล์ที่อยู่ในไดเรกทอรีการทำงานเท่านั้น
36 bash  shell  directory  rm 

7
วิธีกู้คืนเชลล์หลังจากขาดการเชื่อมต่อ
กำลังทำงานบางอย่างกับเครื่อง CentOS 5.6 ระยะไกลและเครือข่ายของฉันลดลงเรื่อย ๆ มีวิธีที่ฉันสามารถกู้คืนเซสชันที่หยุดทำงานหลังจากเชื่อมต่อใหม่ได้หรือไม่ แก้ไข: ฉันกำลังทำการปรับปรุงและติดตั้งด้วย yum และฉันกังวลว่านี่อาจเป็นปัญหาหากกระบวนการยังคงค้างอยู่ตรงกลางของสิ่งที่พวกเขากำลังทำอยู่

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