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

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

3
ฉันจะตรวจสอบได้อย่างไรว่าฉันอยู่ในชั้นย่อย
ฉันพยายามเขียนฟังก์ชั่นเพื่อแทนที่ฟังก์ชั่นการทำงานของexitbuiltin เพื่อป้องกันตัวเองไม่ให้ออกจากเครื่อง ฉันพยายามใช้SHLVLตัวแปรสภาพแวดล้อม แต่ดูเหมือนจะไม่เปลี่ยนแปลงภายใน subshells: $ echo $SHLVL 1 $ ( echo $SHLVL ) 1 $ bash -c 'echo $SHLVL' 2 ฟังก์ชั่นของฉันเป็นดังนี้: exit () { if [[ $SHLVL -eq 1 ]]; then printf '%s\n' "Nice try!" >&2 else command exit fi } สิ่งนี้จะไม่อนุญาตให้ฉันใช้exitภายใน subshells แม้ว่า: $ exit Nice try! $ …
24 bash  shell  exit  subshell 


3
ยังมีระบบรอบ ๆ ด้วยไบนารี / bin / sh?
/bin/shที่เปลือกบอร์นที่สร้างขึ้นในปี 1977 ที่ใช้จะเป็นเปลือกเริ่มต้นสำหรับระบบปฏิบัติการ Unix ทุกวันนี้ไฟล์นี้ยังคงมีอยู่ แต่ส่วนใหญ่เป็นเพียงลิงก์สัญลักษณ์ไปยังเชลล์เริ่มต้นที่เข้ากันได้กับ POSIX ซึ่งติดตั้งอยู่ในระบบ บน RHEL / CentOS มันชี้ไป/bin/bashที่เปลือก Bourne Again บน Ubuntu Linux ชี้ไป/bin/dashที่เชลล์ Debian Almquist บนเดเบียนจะชี้ไปที่/bin/dash(6.0 และใหม่กว่า; เดเบียนที่มีอายุมากกว่าให้ชี้ไปที่/bin/bash) ซึ่งทำให้ผมอยากรู้อยากเห็น: มีระบบ Unix หรือ Linux distro ที่ยังคงมีไบนารีสำหรับ/bin/sh?

4
ฉันจะแทนที่ AND (&&) ในวง for ได้อย่างไร
ฉันต้องการหาสิ่งที่เทียบเท่า cmd 1 && cmd 2 && ... && cmd 20 แต่มีคำสั่งแสดงอยู่ภายในforลูปเช่น for i in {1..20} do cmd $i done คุณอยากแนะนำอะไรให้เปลี่ยนในนิพจน์ที่สองเพื่อหาค่าที่เท่ากัน

2
$ {PATH: +: $ {PATH}} หมายถึงอะไร
ฉันเพิ่งสังเกตเห็นสิ่งต่อไปนี้ในโปรไฟล์ cygwin ของฉันแม่นยำยิ่งขึ้น: /usr/local/bin:/usr/bin${PATH:+:${PATH}} มันหมายความว่าอะไร? ทำไมไม่ใช่แค่ $ PATH นี่คือ 'ถ้า $ PATH มีอยู่แล้วเพิ่ม: $ PATH' หรือไม่ จุดประสงค์ของฉันคือการสลับลำดับและวางเส้นทาง cygwin ที่อยู่ด้านหลังหน้าต่างเส้นทาง ในอดีตฉันจะมี $PATH:/usr/local/bin:/usr/bin แต่สิ่งนี้ทำให้ฉันสับสน บางทีฉันควรจะทำ PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin" การผนวก: เมื่อสิ้นสุด $ PATH?

1
เหตุใดอักขระตัวแทนที่ไม่มีเครื่องหมายในการทำงานระยะไกลจึงใช้ scp
ฉันพิมพ์สิ่งนี้ใน Bash: scp user@remote:~/dir/*.xml . และใช้งานได้รับไฟล์ทั้งหมดที่สร้างไวด์การ์ดบนเซิร์ฟเวอร์ระยะไกล แต่ทำไมถึงใช้งานได้? scpผมคิดว่าทุบตีขยายนิพจน์ตัวแทนในการขัดแย้งก่อนที่จะกลายเป็นข้อโต้แย้งที่มองเห็นเครื่องมือเช่น
24 bash  shell  wildcards 

1
การลบเครื่องหมายเป็นอักขระตัวแรกของคำสั่งในเอาต์พุต htop หมายความว่าอย่างไร
ใน htop หรือคำสั่งอื่น ๆ ที่แสดงสถานะกระบวนการกระบวนการทุบตีทั้งหมดมีในคอลัมน์คำสั่ง /bin/bash แต่มีหนึ่งกระบวนการในคอลัมน์คำสั่ง -bash มันหมายความว่าอะไร?
24 shell  process 

3
เปลี่ยนชื่อไดเรกทอรีปัจจุบันจากเปลือก - เป็นไปได้?
เป็นไปได้ไหมที่จะเปลี่ยนชื่อไดเรกทอรีการทำงานปัจจุบันจากภายในเชลล์ (Bash ในกรณีเฉพาะของฉัน)? หากฉันพยายามทำสิ่งนี้อย่างตรงไปตรงมาฉันก็พบว่ามีข้อผิดพลาด: nathan@nathan-desktop:/tmp/test$ mv . test2 mv: cannot move ‘.’ to ‘test2’: Device or resource busy มีวิธีอื่นในการทำเช่นนี้โดยไม่เปลี่ยนไดเรกทอรีปัจจุบันหรือไม่? ฉันรู้ว่าฉันสามารถทำสิ่งนี้ได้อย่างง่ายดายโดยการเปลี่ยนเป็นไดเรกทอรีหลัก แต่ฉันอยากรู้ว่าจำเป็นหรือไม่ ท้ายที่สุดถ้าฉันเปลี่ยนชื่อไดเรกทอรีจากเปลือกอื่นฉันยังคงสามารถสร้างไฟล์ในเปลือกเดิมหลังจากนั้น
24 shell  rename 

4
เริ่มต้นด้วย bash: -lt และ -gt อาร์กิวเมนต์
ฉันเริ่มต้นด้วยทุบตีและฉันพบต่อไปนี้: if test $first -lt $second then echo $first is lower than $second else if test $first -gt $second then echo $first is higher than $second else echo $first and $second are equals fi fi สำหรับการอ่านสคริปต์และดำเนินการฉันรู้ว่ามันทำอะไร แต่ไม่ใช่สิ่งที่ -lt และ -gt ใครสามารถบอกฉันได้ว่าชื่อ 'เครื่องมือ' ประเภทนั้นคืออะไรและพวกเขา (-lt และ -gt) ทำอะไร ขอบคุณ!
24 bash  shell  test 

3
ฉันจะเปลี่ยนทิศทางเอาต์พุต "time" และเอาต์พุตคำสั่งไปยังไพพ์เดียวกันได้อย่างไร
fooสมมติว่าฉันมีไบนารีที่เรียกว่า หากฉันต้องการเปลี่ยนเส้นทางผลลัพธ์fooไปยังกระบวนการอื่นbarฉันสามารถเขียน./foo | barได้ ในทางกลับกันถ้าฉันต้องการtimefoo และเปลี่ยนเส้นทางผลลัพธ์ของtimeฉันสามารถเขียน, time (./foo) | bar. คำถามของฉันคือฉันจะติดเอาท์พุทของtimeไปยังจุดสิ้นสุดของการส่งออกfooและท่อผ่านท่อเดียวกันได้อย่างไร วิธีการแก้ปัญหาต่อไปนี้เป็นไม่ได้สิ่งที่ฉันกำลังมองหาเพราะมันเริ่มต้นสองกรณีแยกต่างหากของกระบวนการในขณะที่ฉันต้องการท่อที่ใช้ร่วมกันเดียวกับเช่นเดียวของbarbar time (./foo | bar) | bar สำหรับผู้ที่อยากรู้อยากเห็นเหตุผลที่ไม่ต้องการเริ่มต้นสองอินสแตนซ์ของbarเพราะbarเป็นเครือข่ายลูกค้าและฉันต้องการข้อมูลเวลาที่จะถูกส่งไปยังเซิร์ฟเวอร์เป็นส่วนหนึ่งของhttp POSTข้อความเดียวกันเป็นผลลัพธ์ของกระบวนการ

1
ค้นหาและ rsync?
ฉันต้องการที่จะสามารถค้นหาไฟล์ในช่วง 14 วันและนานกว่า 10k และกว่า rsync ที่พบไฟล์ไปยังปลายทาง มีวิธีรวมคำสั่งทั้งสองนี้หรือไม่? find ./ -mtime +14 -size +10k rsync --remove-sent-files -avz /src /dest
24 bash  shell  find  pipe  rsync 

2
คุณจะบันทึกทุกคำสั่งที่พิมพ์ได้อย่างไร
คุณจะบันทึกคำสั่งทุกคำสั่งที่บางคนใส่ลงไปในเชลล์ได้อย่างไร? ฉันกำลังถามทั้งสองเกี่ยวกับพื้นฐานของการป้องกันตัวเองว่าคุณลงชื่อเข้าใช้เซิร์ฟเวอร์ของผู้อื่นและมีบางอย่างผิดปกติหรือไม่หรือหากมีคนอื่นลงชื่อเข้าใช้เซิร์ฟเวอร์ของคุณ แม้แต่สามเณรก็สามารถข้ามประวัติศาสตร์ด้วยunset historyหรือสร้างกระสุนใหม่เพื่อซ่อนเส้นทางของพวกเขา ฉันอยากรู้ว่าผู้ดูแลระบบลินุกซ์อาวุโสติดตามคำสั่งใดบ้างที่ถูกป้อน / เปลี่ยนแปลงในระบบ

8
ฉันจะระบุตัวแปรสภาพแวดล้อมของกระบวนการอื่นได้อย่างไร
ถ้าฉันตรวจสอบ/proc/1/environฉันจะเห็นสตริง1สภาพแวดล้อมของกระบวนการของสตริงที่คั่นด้วย null ฉันต้องการนำตัวแปรเหล่านี้เข้าสู่สภาพแวดล้อมปัจจุบันของฉัน มีวิธีง่ายๆในการทำเช่นนี้หรือไม่? หน้าคนให้ฉันข้อมูลโค้ดซึ่งจะช่วยให้การพิมพ์จะออกแต่ละตัวแปรสภาพแวดล้อมบนพื้นฐานบรรทัดโดยบรรทัดproc (cat /proc/1/environ; echo) | tr '\000' '\n'สิ่งนี้ช่วยฉันในการตรวจสอบเนื้อหาว่าถูกต้อง แต่สิ่งที่ฉันต้องทำจริงๆคือส่งตัวแปรเหล่านี้ไปยังเซสชัน bash ปัจจุบันของฉัน ฉันจะทำอย่างไร


3
กฎสำหรับเรียกใช้ subshell ใน Bash?
ฉันดูเหมือนจะเข้าใจผิดกฎของ Bash ในการสร้าง subshell ฉันคิดว่าวงเล็บจะสร้าง subshell เสมอซึ่งจะทำงานเหมือนกระบวนการของตัวเอง อย่างไรก็ตามนี่ไม่ใช่กรณี ใน Code Snippet A (ด้านล่าง) sleepคำสั่งที่สองไม่ได้ทำงานในเชลล์แยกต่างหาก (ตามที่กำหนดโดยpstreeเทอร์มินัลอื่น) อย่างไรก็ตามใน Code Snippet B sleepคำสั่งที่สองจะทำงานในเชลล์แยกต่างหาก ความแตกต่างเพียงอย่างเดียวระหว่างตัวอย่างก็คือตัวอย่างที่สองมีสองคำสั่งภายในวงเล็บ มีใครบ้างที่โปรดอธิบายกฎสำหรับตอนที่สร้าง subshells รหัส SNIPET A: sleep 5 ( sleep 5 ) รหัส SNIPET B: sleep 5 ( x=1 sleep 5 )

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