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

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

3
คุณจะทราบได้อย่างไรว่าตัวแปรเชลล์ส่งออกหรือไม่
ด้วยตระกูลเชลล์ Bourne ตัวแปรเชลล์ทั้งหมดมีชื่อตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก ซึ่งหมายความว่าคุณไม่สามารถบอกได้ว่าตัวแปรเฉพาะเป็นตัวแปรสภาพแวดล้อมหรือไม่เพียงแค่ดูที่ชื่อ คุณจะทราบได้อย่างไรว่าตัวแปรเชลล์ของ Bourne นั้นเป็นแบบโลคัล (กำหนดภายในเชลล์ปัจจุบันเท่านั้น)
13 bash  shell 

2
เชลล์อื่นที่ไม่ใช่ Bash และ Zsh สนับสนุนการอ้างอิง ANSI-C หรือไม่ เช่น $ 'string'
ฉันมีเชลล์สคริปต์ที่ใช้สิ่งต่อไปนี้เพื่อพิมพ์เครื่องหมายถูกสีเขียวในผลลัพธ์: col_green="\e[32;01m" col_reset="\e[39;49;00m" echo -e "Done ${col_green}✓${col_reset}" หลังจากที่ได้อ่านเกี่ยวกับการทุบตีของANSI-C Quotingผมรู้ว่าผมสามารถใช้มันเมื่อตั้งค่าตัวแปรสีของฉันและเอา-eธงจากฉันก้อง col_green=$'\e[32;01m' col_reset=$'\e[39;49;00m' echo "Done ${col_green}✓${col_reset}" ดูเหมือนว่าน่าสนใจเพราะมันหมายถึงข้อความที่พิมพ์อย่างถูกต้องไม่ว่ามันจะถูกส่งผ่านไปยังเสียงสะท้อนในตัวของ Bash หรือการใช้งานภายนอก/bin/echo(ฉันใช้บน macOS) แต่สิ่งนี้ทำให้สคริปต์พกพาน้อยลงหรือไม่ ฉันรู้ว่า Bash และ Zsh สนับสนุนรูปแบบการอ้างอิงนี้ แต่ฉันไม่แน่ใจเกี่ยวกับคนอื่น

3
เล่นคำบรรยายโดยอัตโนมัติด้วย mpv
ไฟล์คำบรรยายมีหลายรูปแบบตั้งแต่. srt ถึง. sub ถึง. ass และอื่น ๆ มีวิธีที่จะบอก mpv เพื่อค้นหาไฟล์คำบรรยายพร้อมกับไฟล์สื่อและถ้ามันจะเริ่มเล่นไฟล์โดยอัตโนมัติ ขณะนี้ฉันต้องทำอะไรแบบนี้ซึ่งอาจจะค่อนข้างยาวขึ้นอยู่กับชื่อไฟล์ - [$] mpv --list-options | grep sub-file (null) requires an argument --sub-file String list (default: ) [file] หวังว่าจะได้คำตอบ อัปเดต 1 - ภาพยนตร์ทั่วไปที่มี. srt (หรือตัวห้อย) [$] mpv Winter.Sleep.\(Kis.Uykusu\).2014.720p.BrRip.2CH.x265.HEVC.Megablast.mkv (null) requires an argument Playing: Winter.Sleep.(Kis.Uykusu).2014.720p.BrRip.2CH.x265.HEVC.Megablast.mkv (+) Video --vid=1 (*) (hevc) …

5
จะ 'วาง' / ลบตัวอักษรจากด้านหน้าของสตริงได้อย่างไร?
ฉันมีสตริงที่ฉันต้องการจัดการ สตริงเป็นH08W2345678วิธีที่ฉันจะสามารถจัดการกับมันดังนั้นการส่งออกเป็นเพียงแค่W2345678? ในทำนองเดียวกันถ้าฉันต้องการที่จะลดตัวละคร 4 ตัวสุดท้ายจากH08W2345678นั้นฉันH08W234จะทำยังไงดี?

5
ฉันจะระงับข้อความแสดงข้อผิดพลาดจาก cp ได้อย่างไร
cpฉันกำลังมองหาวิธีการที่จะสั่งปราบข้อผิดพลาดในลินุกซ์โดยเฉพาะอย่างยิ่งคำสั่ง ฉันทำ: root@ubuntu:~$ cp /srv/ftp/201*/wha*/*.jj ~/. cp: cannot stat `/srv/ftp/201*/wha*/*.jj': No such file or directory ฉันจะระงับข้อความแสดงข้อผิดพลาดที่พิมพ์บนหน้าจอได้อย่างไร นั่นคือฉันไม่ต้องการเห็นข้อความแสดงข้อผิดพลาดนี้ในมอนิเตอร์ของฉัน
13 shell  wildcards  cp 

2
วิธีรับชื่อจริงของเทอร์มินัลการควบคุม?
เราจะได้รับชื่อจริงของเทอร์มินัลการควบคุมได้อย่างไร (ถ้ามีอีกหนึ่งข้อผิดพลาด) เป็นชื่อพา ธ โดย "ชื่อจริง" ฉันหมายถึงไม่/dev/ttyซึ่งไม่สามารถใช้โดยกระบวนการอื่น ๆ เพื่ออ้างถึงเทอร์มินัลเดียวกัน ฉันชอบคำตอบเป็นรหัสเปลือกง่าย (เช่นตัวอย่างด้านล่าง) ถ้าเป็นไปได้มิฉะนั้นเป็นฟังก์ชั่น C โปรดทราบว่าสิ่งนี้จะต้องใช้งานได้แม้ว่าจะมีการเปลี่ยนเส้นทางอินพุตมาตรฐานเพื่อให้ttyไม่สามารถใช้ยูทิลิตี้: หนึ่งจะได้รับnot a ttyข้อผิดพลาดในกรณีเช่นนี้เนื่องจากttyเพียงพิมพ์ชื่อไฟล์ของเทอร์มินัลที่เชื่อมต่อกับอินพุตมาตรฐาน ภายใต้ Linux สามารถใช้: echo "/dev/`ps -p $$ -o tty | tail -n 1`" แต่นี้ไม่ได้พกพาเป็นไปตาม POSIX, รูปแบบของชื่อสถานีเป็นที่ไม่ได้ระบุ เกี่ยวกับฟังก์ชั่น C, ctermid (NULL)ส่งคืน/dev/ttyซึ่งไม่มีประโยชน์ที่นี่ หมายเหตุ:ตามzshเอกสารประกอบอย่างใดอย่างหนึ่งที่สามารถทำได้ zsh -c 'echo $TTY' แต่ตอนนี้ (เวอร์ชั่น 5.0.7) ล้มเหลวเมื่อทั้งอินพุตมาตรฐานและเอาต์พุตมาตรฐานถูกเปลี่ยนเส้นทาง: $ zsh -c 'echo …

5
ฉันจะ sudo su และเปลี่ยนไดเรกทอรีได้อย่างไร
ฉันต้องการสร้างนามแฝงที่ทำสิ่งนี้: alias userYYY='sudo su userYYY; cd /a/path/that/only/userYYY/has/access' ดังนั้นแล้วจากบรรทัดคำสั่งของฉันฉันเข้าสู่ระบบด้วยผู้ใช้ sudo และผมอยากจะพิมพ์นามแฝงuserYYYเพื่อให้เปลือกของฉันถูกบันทึกไว้ตอนนี้มีuserYYYและเป็นpwd/a/path/that/only/userYYY/has/access ฉันจะทำสิ่งนั้นได้อย่างไร นี่userYYYคือการเรียกใช้กระบวนการบางอย่างและจะต้องมีอะไรในบ้านของมัน ดังนั้นฉันพยายามเปลี่ยน $ HOME โดยใช้: sudo usermod -m -d /a/path/that/only/userYYY/has/access userYYY และจากเปลือกของฉันกับแฟ้ม sudoer sudo su userYYYของฉันฉันทำ แต่นั่นไม่ได้ผล สิ่งเดียวที่ใช้ได้คือsudo su -l userYYYYแต่เปิด bash ใหม่ภายในเชลล์เดิมของฉัน ( -bash-4.1$ ....) โดยสรุปสิ่งที่ฉันต้องการคือหลีกเลี่ยงการเขียน 2 บรรทัดในเชลล์: sudo su userYYY cd /a/path/that/only/userYYY/has/access ความคิดใด ๆ
13 bash  shell  sudo  su 

4
เลือกบรรทัดจากไฟล์ข้อความที่มีรหัสอยู่ในไฟล์อื่น
ฉันใช้ grep awk sort ในเชลล์ unix จำนวนมากเพื่อทำงานกับไฟล์ข้อความคอลัมน์แบบแยกแท็บขนาดกลาง (ประมาณ 10M-100M) ในแง่นี้ยูนิกซ์เชลล์คือสเปรดชีตของฉัน แต่ฉันมีปัญหาใหญ่หนึ่งอย่างนั่นคือการเลือกระเบียนที่ระบุรายการรหัส มีtable.csvไฟล์ที่มีรูปแบบid\tfoo\tbar...และids.csvไฟล์ที่มีรายชื่อของรหัสเพียงเลือกระเบียนจากtable.csvที่มี ID ids.csvอยู่ใน ชนิดของ/programming/13732295/extract-all-lines-from-text-file-based-on-a-given-list-of-idsแต่มีเชลล์ไม่ใช่ perl grep -Fเห็นได้ชัดว่าสร้างผลบวกที่ผิดพลาดถ้ารหัสเป็นความกว้างของตัวแปร joinเป็นเครื่องมือที่ฉันไม่สามารถหาได้ ก่อนอื่นก็ต้องเรียงลำดับตัวอักษร (ไฟล์ของฉันมักจะเรียงลำดับตัวเลข) แต่ถึงอย่างนั้นฉันก็ไม่สามารถทำงานได้โดยไม่บ่นเกี่ยวกับลำดับที่ไม่ถูกต้องและข้ามบางระเบียน ดังนั้นฉันไม่ชอบมัน grep -f เทียบกับไฟล์ที่มี^id\t-s ช้ามากเมื่อจำนวนรหัสมีขนาดใหญ่ awkยุ่งยาก มีวิธีแก้ปัญหาที่ดีสำหรับเรื่องนี้หรือไม่? มีเครื่องมือเฉพาะสำหรับไฟล์ที่คั่นด้วยแท็บหรือไม่ ฟังก์ชั่นพิเศษจะได้รับการต้อนรับมากที่สุดเช่นกัน UPD: แก้ไขแล้วsort->join
13 shell  csv 

1
IFS null ไม่เหมือนกับ IFS unset หรือไม่
ผมอ่านคำถามที่ดีที่นี่เรียกว่าเข้าใจไอเอฟเอ ฉันรู้สึกประหลาดใจเพราะคำตอบและความคิดเห็นอ้างถึง POSIX ซึ่งระบุว่า IFS = ไม่เหมือนกับการยกเลิกการตั้งค่า IFS หากคุณยกเลิกการตั้งค่า IFS จะเห็นได้ว่ามีการใช้ค่าเริ่มต้น ถ้าคุณทำให้ IFS เป็นโมฆะแทนจะไม่มีตัวแยก ฉันรู้ว่าฉันเคยเห็นสิ่งที่แตกต่างและฉันพบสิ่งนี้ในบุ๊คมาร์คของฉัน: การเขียนโปรแกรม Bourne Shell $ ไอเอฟเอ ข้อความแรกสุดในสคริปต์ของคุณควรเป็น ไอเอฟเอ = ซึ่งรีเซ็ตตัวคั่นฟิลด์อินพุตเป็นค่าดีฟอลต์ มิฉะนั้นคุณจะสืบทอด $ IFS จากผู้ใช้ซึ่งอาจจะตั้งค่าเป็นค่าที่แปลกประหลาดบางอย่างเพื่อสร้างสตริงการแยกวิเคราะห์ที่แตกต่างจากที่คุณคาดไว้และทำให้เกิดพฤติกรรมแปลก ๆ เป็นเช่นนั้นจริงเมื่อไม่นานมานี้หรือผู้แต่งผิดพลาด

5
วิธีรับจุดเมานต์ของระบบไฟล์ที่มีไฟล์ที่กำหนด
ฉันกำลังมองหาวิธีที่รวดเร็วในการค้นหาจุดเมานท์ของระบบไฟล์ที่มีไฟล์ที่กำหนด มีอะไรที่ง่ายกว่าหรือมากกว่าตรงกว่าโซลูชันของฉันด้านล่างหรือไม่ df -h FILE |tail -1 | awk -F% '{print $NF}' | tr -d ' ' คำถามที่คล้ายกัน " มีคำสั่งให้ดูตำแหน่งที่ติดตั้งดิสก์หรือไม่ " ใช้โหนดอุปกรณ์ของดิสก์ปัจจุบันเป็นอินพุตและไม่ใช่ไฟล์โดยพลการจากดิสก์ ...

4
เขียนไปยังไฟล์ที่ไม่มีการเปลี่ยนเส้นทางหรือไม่?
ฉันกำลังเขียนแอปพลิเคชันที่คอมไพล์ปกติที่ต้องการสร้างไฟล์พิเศษและเขียนคุกกี้วิเศษลงไป ฉันไม่สามารถเขียนไฟล์ได้โดยตรงจากแอปพลิเคชันโมเดลความปลอดภัยของระบบต้องการให้ฉันเปิดใช้เครื่องมือตัวช่วยที่มีสิทธิ์ระดับสูงในการทำเคล็ดลับ ฉันสามารถให้ข้อโต้แย้งกับเครื่องมือช่วยเหลือได้ไม่ จำกัด จำนวน ตอนนี้ฉันต้องการเลือกคำสั่งระบบที่ง่ายมากซึ่งจะทำหน้าที่เป็นเครื่องมือช่วยเหลือและสร้างไฟล์ให้ฉัน บางสิ่งเช่นนี้ /bin/sh -c "/bin/echo -n 'magic' > /some/where/file" Simple touchไม่ตัดตามที่ฉันต้องการเขียนคุกกี้ลงในไฟล์ง่ายๆechoโดยไม่มี shell wrapper ไม่ทำงานเนื่องจากต้องการการเปลี่ยนเส้นทางเพื่อเขียนไฟล์ ฉันรู้สึกไม่สบายใจที่จะเรียกเชลล์ด้วยสิทธิพิเศษรูทเพื่อทำงานที่ไม่สำคัญ มีคำสั่งระบบที่เรียบง่ายและ จำกัด มาก ๆ ที่ฉันสามารถเรียกให้เขียนไฟล์ให้ฉันได้ไหม?

3
วิธีการพอร์ตไปยังสไตล์ทุบตีเพื่อเถ้า?
ashบางเวลาที่ผ่านมาฉันได้เขียนสคริปต์ทุบตีซึ่งขณะนี้ควรจะสามารถที่จะทำงานในสภาพแวดล้อมที่มี ในbashมันเป็นเหมือน: services=( "service1.service" "service2.service" "service3.service" ) for service in "${services[@]}" do START $service done START() { echo "Starting "$1 systemctl start $1 } ในความเป็นจริงมีบริการอยู่ 40 รายการและฉันต้องการทำให้การเปลี่ยนแปลงนี้ไม่เจ็บปวดและสะอาดเท่าที่จะเป็นไปได้ มีการใช้bashisms เสมอ ตอนนี้ฉันกำลังเหน็บแนมกับงานเพื่อให้สคริปต์พกพาได้มากขึ้น สำหรับเหตุผลในการพกพาอาจเป็นเรื่องดีที่จะมีashโซลูชันที่บริสุทธิ์ แต่เนื่องจากฉันมีความแข็งแกร่งbusyboxในการจัดการของฉันฉันอาจเสียสละบางพกพา เฉพาะในกรณีที่ความสามารถในการอ่านดีขึ้นมากเนื่องจากสคริปต์ "clean" เป็นเมตริกเช่นกัน ในกรณีนี้โซลูชันแบบพกพาและสะอาดจะเป็นอย่างไร
13 bash  shell  array  ash 

3
คลายการบีบอัดไฟล์ใน. txz และ. tar ด้วยคำสั่งเดียว
ฉันมีไฟล์บีบอัดใน * .txz หลังจากแกะออกแล้วฉันได้รับไฟล์ * .tar มีวิธีการแตกมันสองครั้งด้วยคำสั่งเดียว? ฉันหมายถึงไฟล์แกะ (* .tar) .txz ด้วยคำสั่งเดียว? รู้ฉันทำแบบนี้: xz -d file.txz tar xvf file.tar แต่ฉันสงสัยว่ามีวิธีที่ดีกว่า
13 shell  tar  compression 


2
ฉันจะรันคำสั่งบนหลายไฟล์ได้อย่างไร
นี่เป็นพื้นฐานที่ค่อนข้างฉันมีโฟลเดอร์ที่มีโฟลเดอร์ย่อยหลายไฟล์ของ JS และฉันต้องการเรียกใช้คอมไพเลอร์ Clojure ของ Google ในไฟล์ทั้งหมดในโฟลเดอร์เหล่านั้น คำสั่งในการประมวลผลไฟล์เดียวมีดังนี้: java -jar compiler.jar --js filename.js --js_output_file newfilename.js ฉันจะแก้ไขสิ่งนี้ให้ทำงานกับทุกไฟล์ JS ในโครงสร้างไดเรกทอรีของฉันได้อย่างไร

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