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

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

1
เป็นไปได้หรือไม่ที่จะมีการผูกคีย์กลุ่มในเทอร์มินัล
ฉันคุ้นเคยกับการผูกข้อความ (เช่นกด w เพื่อไปยังคำ, dw เพื่อลบคำและอื่น ๆ ) และมันเป็นโหมด (แทรก, ปกติ, ภาพ) และจากความอยากรู้อยากเห็น: มีบางอย่าง การใช้งานลักษณะการทำงานของโหมดและการเชื่อมโยงจากกลุ่มไปยังเทอร์มินัลของฉันเป็นอย่างไร มีโหมดแทรกโหมดปกติและเช่น ...
42 bash  shell  terminal  vim  zsh 

5
ตัวแปรสภาพแวดล้อมคืออะไร
ฉันรู้ว่าVARIABLE=valueสร้างตัวแปรสภาพแวดล้อมและexport VARIABLE=valueทำให้พร้อมใช้งานสำหรับกระบวนการที่สร้างโดยเชลล์ปัจจุบัน envแสดงตัวแปรสภาพแวดล้อมปัจจุบัน แต่พวกมันอยู่ที่ไหน สิ่งที่ประกอบด้วยตัวแปรสภาพแวดล้อม (หรือสภาพแวดล้อมสำหรับเรื่องนั้น)?

10
จะตรวจสอบได้อย่างไรว่าไพพ์นั้นว่างเปล่าและเรียกใช้คำสั่งกับข้อมูลหากไม่มีหรือไม่
ฉันไพพ์บรรทัดในสคริปต์ทุบตีและต้องการตรวจสอบว่าไพพ์มีข้อมูลหรือไม่ก่อนป้อนเข้าโปรแกรม กำลังค้นหาฉันพบtest -t 0แต่มันใช้งานไม่ได้ที่นี่ ส่งคืนค่าเท็จเสมอ ดังนั้นจะแน่ใจได้อย่างไรว่าท่อมีข้อมูลหรือไม่ ตัวอย่าง: echo "string" | [ -t 0 ] && echo "empty" || echo "fill" เอาท์พุท: fill echo "string" | tail -n+2 | [ -t 0 ] && echo "empty" || echo "fill" เอาท์พุท: fill ซึ่งแตกต่างจากวิธีมาตรฐาน / มาตรฐานเพื่อทดสอบว่าก่อนหน้านี้ท่อที่ผลิตได้หรือไม่ อินพุตจะต้องเก็บรักษาไว้เพื่อส่งผ่านไปยังโปรแกรม นี่เป็นการสรุปวิธีการไพพ์เอาท์พุทจากโปรเซสหนึ่งไปยังอีกโปรเซสเท่านั้น ซึ่งมุ่งเน้นการส่งอีเมล
42 bash  shell  pipe 


1
ความแตกต่างระหว่างตัวแปรเชลล์ที่ถูกเอ็กซ์พอร์ตและที่ไม่ได้อยู่ใน bash
Bash ดูเหมือนจะแยกความแตกต่างระหว่างตัวแปรที่ถูกส่งออกและที่ไม่ได้ ตัวอย่าง: $ FOO=BAR $ env | grep FOO $ set | grep FOO FOO=BAR setเห็นตัวแปร แต่envทำไม่ได้ $ export BAR=FOO $ env | grep FOO BAR=FOO $ set | grep FOO BAR=FOO FOO=BAR setเห็นทั้งสองตัวแปร แต่envเห็นเฉพาะตัวแปรที่ส่งออก ฉันรู้ว่านั่นsetคือทุบตี builtin และenvไม่ อะไรคือความแตกต่างระหว่างตัวแปรที่ถูกเอ็กซ์พอร์ตและตัวแปรที่ไม่ใช่?


4
วิธีเรียกใช้งานหลายคำสั่งโดยใช้ nohup
nohupฉันจำเป็นต้องดำเนินการคำสั่งต่างๆโดยใช้ แต่ละคำสั่งควรถูกเรียกใช้งานหลังจากคำสั่งก่อนหน้า ฉันใช้คำสั่งนี้เป็นตัวอย่าง: nohup wget $url && wget $url2 > /dev/null 2>&1 & อย่างไรก็ตามคำสั่งนั้นไม่ทำงาน ฉันควรใช้คำสั่งอะไรเพื่อจุดประสงค์นี้

4
ฉันจะออกหรือยกเลิกคำสั่ง bash ที่ไม่ดีได้อย่างไร
ฉันคาดว่าจะได้รับสะเก็ดระเบิดนี้ แต่ฉันไม่สามารถหาคำตอบได้ทุกที่ ดูเหมือนว่ามันควรจะชัดเจน บางครั้งเมื่อฉันพิมพ์คำสั่งที่ไม่ดีในเทอร์มินัล bash เคอร์เซอร์เพิ่งกระโดดลงไปที่บรรทัดถัดไปโดยไม่มีข้อผิดพลาดหรืออะไร ฉันไม่สามารถบอกสิ่งที่ฉันทำผิด มันเหมือนกับว่าฉันติดอยู่ในโปรแกรม แนคท์: $ tidy ฉัน: "อ๊ะ! นั่นไม่ใช่สิ่งที่ฉันต้องการพิมพ์ ... " :q ฉัน: "นั่นไม่ได้ผล ... " :exit :quit exit quit /exit /quit -exit -quit -wtf??? ฉันรู้ว่าฉันเมาแล้ว แต่ฉันจะกลับไปที่พรอมต์ได้อย่างไรโดยไม่ต้องปิดเครื่อง

3
ฉันจะเปลี่ยนจากเชลล์ที่ไม่รู้จักเป็นทุบตีได้อย่างไร
ฉันประหลาดใจที่ฉันไม่พบคำถามนี้บนไซต์แล้ว ดังนั้นวันนี้$ขึ้นมาหลังจากที่ฉันเข้าสู่ระบบในฐานะผู้ใช้ใหม่ username@computername:~$นี่คือที่ไม่คาดคิดเพราะผู้ใช้หลักของฉันเริ่มต้นกับพรอมต์ ดังนั้นฉันจะเปลี่ยนจากเชลล์อื่นนี้เป็นทุบตีได้อย่างไร
41 shell 

5
การเปลี่ยนเส้นทางเนื้อหาของไฟล์ไปยังคำสั่ง“ echo”
ฉันมีไฟล์ชื่อที่มีเนื้อหาเป็นเพียงสตริงmy_file.txt Helloฉันจะเปลี่ยนเส้นทางเนื้อหาไปยังคำสั่งได้echoอย่างไร ฉันรู้ว่าฉันมีคำสั่งless, cat, more... echoแต่ฉันต้องทำมันด้วย ฉันลองสิ่งนี้: $ cat my_file.txt | echo และสิ่งนี้: $ echo < my_file.txt แต่ในทั้งสองกรณีจะปรากฏเพียงช่องว่างใน stdout ไม่ใช่เนื้อหาของ my_file.txt ฉันจะทำสิ่งนั้นได้อย่างไร

2
เท่ากับ $ HOME เสมอหรือเปล่า
ฉันรู้ว่าอาจมีการถามก่อนหน้านี้ แต่ฉันไม่พบมันด้วย Google ป.ร. ให้ไว้ เคอร์เนล Linux ไม่มีการกำหนดค่าที่เปลี่ยนแปลง $ HOME ทุบตี จะ~ == $HOMEเป็นจริงหรือ

7
ฉันจะประสบความสำเร็จในการพกพาได้ด้วย sed -i (การแก้ไขในสถานที่) ได้อย่างไร
ฉันกำลังเขียนเชลล์สคริปต์สำหรับเซิร์ฟเวอร์ของฉันซึ่งเป็นโฮสติ้งที่ใช้ร่วมกันที่ใช้ FreeBSD ฉันยังต้องการที่จะทดสอบพวกเขาในพื้นที่บนพีซีของฉันที่ใช้ Linux ดังนั้นฉันพยายามเขียนแบบพกพา แต่sedฉันไม่เห็นวิธีการทำ ส่วนหนึ่งของเว็บไซต์ของฉันใช้ไฟล์ HTML แบบคงที่ที่สร้างขึ้นและบรรทัด sed นี้แทรก DOCTYPE ที่ถูกต้องหลังจากการสร้างใหม่แต่ละครั้ง: sed -i '1s/^/<!DOCTYPE html> \n/' ${file_name.html} มันทำงานร่วมกับ GNU sedบน Linux แต่ FreeBSD sedคาดว่าอาร์กิวเมนต์แรกหลังจาก-iตัวเลือกที่จะเป็นส่วนขยายสำหรับสำเนาสำรอง นี่คือลักษณะ: sed -i '' '1s/^/<!DOCTYPE html> \n/' ${file_name.html} อย่างไรก็ตาม GNU ในทางกลับกันคาดว่าการแสดงออกที่จะปฏิบัติตามทันทีหลังจากที่sed -i(นอกจากนี้ยังต้องการการแก้ไขด้วยการจัดการบรรทัดใหม่ แต่ได้รับคำตอบแล้วในที่นี้ ) แน่นอนว่าฉันสามารถรวมการเปลี่ยนแปลงนี้ไว้ในสำเนาเซิร์ฟเวอร์ของสคริปต์ แต่นั่นอาจทำให้เกิดความยุ่งเหยิงเช่นการใช้ VCS สำหรับการกำหนดเวอร์ชัน มีวิธีในการบรรลุสิ่งนี้ด้วย sed แบบพกพาอย่างเต็มที่?

4
เป็นไปได้ไหมที่จะกำหนดค่า ctrl-w (ลบคำ)?
โดยปกติCtrl+ Wลบกลับไปที่ช่องว่างสุดท้าย เป็นไปได้หรือไม่ที่จะกำหนดค่าให้ใช้อักขระเพิ่มเติมเช่น/? แก้ไข: เพื่อให้ชัดเจนยิ่งขึ้น: ฉันไม่ต้องการกำหนดค่าคีย์ให้ฉันต้องการหยุดการลบด้วย/เช่นกัน ตัวอย่าง: vim /foo/bar^W vim /foo/

7
ฉันจะจำวิธีใช้การเปลี่ยนเส้นทางได้อย่างไร
ฉันรู้ว่า program > /dev/null 2>&1 ทำ. มันเปลี่ยนเส้นทางการส่งออกไปยัง/dev/nullและ2>&1หมายถึงการเปลี่ยนเส้นทางการส่งออกข้อผิดพลาดในสถานที่เดียวกันที่ส่งออก ปัญหาของฉันคือฉันต้อง google เสมอเพราะฉันไม่เคยจำได้ ดังนั้นฉันพยายาม&2>1, 1>2&, 1>&2... ฉันพยายามทุกชุดจนกว่าฉัน google มัน ... เคล็ดลับในการจดจำได้ง่ายคืออะไร
40 shell 

5
วิธีการกำหนดเชลล์สคริปต์ที่จะต้องจัดหาแหล่งที่มาไม่ได้ทำงาน
ฉันกำลังกำหนดเชลล์สคริปต์ซึ่งผู้ใช้ควรsourceจะดำเนินการมากกว่า มีวิธีธรรมดาหรือชาญฉลาดในการบอกกล่าวผู้ใช้ว่าเป็นเช่นนี้ผ่านทางนามสกุลไฟล์หรือไม่? มีรหัสเชลล์ที่ฉันสามารถเขียนในไฟล์ของตัวเองซึ่งจะทำให้มันสะท้อนข้อความและออกจากถ้ามันถูกดำเนินการแทนแหล่งที่มาเพื่อให้ฉันสามารถช่วยให้ผู้ใช้หลีกเลี่ยงข้อผิดพลาดที่เห็นได้ชัดนี้?
40 bash  shell 

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