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

คำถามเฉพาะของ Bourne อีกครั้งของเชลล์ใน GNU เมื่อเทียบกับเชลล์ Bourne / POSIX อื่น ๆ สำหรับคำถามเกี่ยวกับเชลล์ Unix โดยทั่วไปให้ใช้ / เชลล์แท็กแทน

1
ทำไมฉันไม่สามารถพิมพ์ตัวแปรที่ฉันเห็นได้ในผลลัพธ์ของ env
ฉันสนใจที่จะตั้งค่าตัวแปรสภาพแวดล้อมของเชลล์อินสแตนซ์หนึ่งจากอีกอันหนึ่ง ฉันจึงตัดสินใจทำการวิจัย หลังจากอ่านคำถามจำนวนหนึ่งเกี่ยวกับเรื่องนี้ฉันตัดสินใจที่จะทดสอบ ผมสองกระบอกเปลือกหอย A และ B (PID 420) zshทั้งการทำงาน จาก AI เชลล์วิ่งต่อไปนี้ sudo gdb -p 420 (gdb) call setenv("FOO", "bar", 1) (gdb) detach จาก shell B เมื่อฉันรันenvฉันเห็นตัวแปร FOO ถูกตั้งค่าด้วยค่าบาร์ นี่ทำให้ฉันคิดว่า FOO ได้รับการเริ่มต้นได้สำเร็จในสภาพแวดล้อมของ shell B อย่างไรก็ตามถ้าฉันพยายามพิมพ์ FOO ฉันจะได้รับบรรทัดว่างซึ่งหมายความว่าไม่ได้ตั้งค่าไว้ สำหรับฉันมันรู้สึกเหมือนมีความขัดแย้งที่นี่ สิ่งนี้ได้รับการทดสอบทั้งในระบบ Arch GNU / Linux ของฉันและ Ubuntu VM ฉันยังทดสอบสิ่งนี้bashว่าตัวแปรไม่ได้แสดงใน env แม้ว่ามันจะน่าผิดหวังสำหรับฉัน …

4
จะย้ายและสร้างโฟลเดอร์ใหม่ในเวลาเดียวกันได้อย่างไร?
ฉันมีโฟลเดอร์ชื่อหนึ่งstatisticsในเซิร์ฟเวอร์อูบุนตูซึ่งจัดเก็บไฟล์ข้อมูลเป็นประจำ ฉันจะเปลี่ยนชื่อstatisticsโฟลเดอร์เป็นbackup-xxในขณะที่สร้างstatisticsโฟลเดอร์ใหม่เพื่อให้สามารถจัดเก็บไฟล์ใหม่ได้อย่างไร แฟ้มในstatisticsโฟลเดอร์ที่ถูกสร้างขึ้นโดย file_put_contentsPHP ฉันต้องการเปลี่ยนชื่อโฟลเดอร์เนื่องจากมีไฟล์จำนวนมากในstatisticsโฟลเดอร์

6
ฉันจะรับคำสั่ง sudo เพื่อใช้การตั้งค่าใน /root/.bashrc ได้อย่างไร
ฉันได้ปรับแต่ง.bashrcด้วยชื่อแทนจำนวนหนึ่งโดยเฉพาะllและexport LS_OPTIONS='--color=auto' น่าเสียดายที่นี่ใช้งานไม่ได้เมื่อใช้งานด้วยsudoดังนั้นฉันจึงปรับเปลี่ยน/root/.bashrcเช่นกัน แต่ดูเหมือนว่าจะไม่ทำให้เกิดความแตกต่าง sudo envการแสดงHOME=/rootและSHELL=/bin/bash ฉันจะsudoรับคำสั่งให้ใช้การตั้งค่าได้/root/.bashrcอย่างไร? ฉันเข้าใจว่าสิ่งนี้จะเกิดขึ้นก็ต่อเมื่อbashดำเนินการแบบโต้ตอบเท่านั้นดังนั้นฉันจึงเปิดรับข้อเสนอแนะอื่น ๆ เกี่ยวกับวิธีปรับแต่ง
9 bash  debian  sudo 

2
การเปลี่ยนเส้นทางไฟล์ bash เป็นมาตรฐานแตกต่างจาก shell (`sh`) บน Linux อย่างไร
ฉันเขียนสคริปต์ที่สลับผู้ใช้ในขณะที่ทำงานและดำเนินการโดยใช้การเปลี่ยนเส้นทางไฟล์ไปที่มาตรฐานระบบดังนั้นจึงuser-switch.shเป็น ... #!/bin/bash whoami sudo su -l root whoami และการวิ่งด้วยbashทำให้ฉันมีพฤติกรรมที่ฉันคาดหวัง $ bash < user-switch.sh vagrant root อย่างไรก็ตามถ้าฉันรันสคริปต์ด้วยshฉันจะได้ผลลัพธ์ที่ต่างออกไป $ sh < user-switch.sh vagrant vagrant ทำไมจึงbash < user-switch.shให้ผลลัพธ์ที่แตกต่างกว่าsh < user-switch.sh? หมายเหตุ: เกิดขึ้นในสองกล่องที่แตกต่างกันที่ใช้ Debian Jessie


5
วิธีการตั้งค่า bash readline เป็นโหมด vi โดยอัตโนมัติเมื่อเข้าสู่ระบบ?
ทีมของฉันรับผิดชอบเครื่อง Linux / Unix หลายพันเครื่องดังนั้นโดยปกติบัญชีรูทจะ "แชร์" ท่ามกลางผู้ดูแลระบบ ฉันชอบโหมด vi ส่วนคนอื่นชอบโหมด emacs ฉันจะตั้งค่า readline ของ bash เป็นโหมด vi บนการล็อกอิน SSH ไปยังเครื่องใด ๆ โดยไม่บังคับให้คนอื่นใช้โหมด vi ด้วยเช่นกัน? ในสาระสำคัญต้องการให้มีผลกระทบset -o viหลังจากเข้าสู่ระบบโดยไม่ต้องพิมพ์ทุกครั้งและไม่บังคับให้คนอื่น ๆ (เท่าที่ emacs โหมดเป็นที่น่ารำคาญสำหรับฉันโหมด vi เป็นที่น่ารำคาญสำหรับพวกเขา) ฉันรู้ว่าสิ่งนี้จะไม่เป็นปัญหาหากทุกคนใช้บัญชีของตัวเองกับ sudo เพื่อดำเนินการคำสั่งพิเศษ แต่เนื่องจากสถานการณ์ที่อยู่นอกเหนือการควบคุมของฉันสิ่งนี้น่าเศร้าไม่ใช่ตัวเลือก
9 bash  emacs  vi  readline 

3
วิธีการส่งไฟล์ที่พบโดยหาเป็นข้อโต้แย้ง?
ก่อนอื่นให้ตัดคำตอบที่ไม่สำคัญ แต่ไม่เหมาะสม: ฉันสามารถใช้เคล็ดลับfind+ xargsหรือชุดรูปแบบ (เช่นเดียวfindกับ-exec) เพราะฉันต้องใช้การแสดงออกเช่นนี้ต่อการโทรเล็กน้อย ฉันจะกลับมาที่นี่ในตอนท้าย ตอนนี้เป็นตัวอย่างที่ดีกว่าลองพิจารณา: $ find -L some/dir -name \*.abc | sort some/dir/1.abc some/dir/2.abc some/dir/a space.abc ฉันจะส่งต่อสิ่งเหล่านี้เป็นอาร์กิวเมนต์ไปยังได้programอย่างไร เพียงทำมันไม่ได้ทำเคล็ดลับ $ ./program $(find -L some/dir -name \*.abc | sort) ล้มเหลวเนื่องจากprogramได้รับอาร์กิวเมนต์ดังนี้ [0]: ./program [1]: some/dir/1.abc [2]: some/dir/2.abc [3]: some/dir/a [4]: space.abc ดังที่เห็นได้เส้นทางที่มีช่องว่างถูกแยกออกและprogramพิจารณาว่าเป็นอาร์กิวเมนต์ที่ต่างกันสองรายการ อ้างถึงมันใช้งานได้ ดูเหมือนว่าผู้ใช้มือใหม่เช่นตัวฉันเองเมื่อเผชิญกับปัญหาดังกล่าวมักจะเพิ่มคำพูดแบบสุ่มจนกว่าจะได้ผลในที่สุด - เฉพาะที่นี่ดูเหมือนจะไม่ช่วย ... "$(…)" $ …

5
ปิดใช้งานพฤติกรรมการคัดลอกและวางเริ่มต้นใน Bash
เมื่อฉันวางในเซสชันเทอร์มินัลของฉันเชลล์ดำเนินการคำสั่งทันทีโดยไม่ต้องกดปุ่ม Enter ฉันไม่รู้วิธีปิดใช้งานพฤติกรรมดังกล่าวจริงๆ ฉันใช้เทอร์มินัลที่ติดตั้งไว้แล้วใน MacOS Yosemite
9 bash  terminal  osx 

4
เชลล์สคริปต์สามารถพิมพ์อาร์กิวเมนต์โดยอ้างอิงตามที่คุณต้องการเขียนลงในพร้อมท์เชลล์หรือไม่
ในเชลล์สคริปต์ความเข้าใจของฉันคือการ"$@"ขยายไปยังอาร์กิวเมนต์ของสคริปต์โดยอ้างอิงตามที่ต้องการ เช่นนี้ส่งต่อข้อโต้แย้งสคริปต์เพื่อ gcc: gcc -fPIC "$@" <<<แม้ว่าการใช้ไวยากรณ์ bash pass-to-stdin นั้น"@$"ไม่ได้ผลอย่างที่ฉันคาดไว้ #!/bin/bash cat <<< "$@" เรียกสคริปต์ตามที่./test.sh foo "bar baz"ให้ไว้ foo bar baz ฉันคาดหวัง foo "bar baz" มีวิธีเขียนเชลล์สคริปต์ที่พิมพ์อาร์กิวเมนต์เป็นคุณจะเขียนไว้ใน shell prompt หรือไม่ ตัวอย่างเช่น: คำใบ้เกี่ยวกับคำสั่งที่จะใช้ถัดไปรวมถึงอาร์กิวเมนต์ของสคริปต์ในคำใบ้

2
อะไรคือความแตกต่างระหว่าง $ 'string' ที่ยกมาเดี่ยวกับ $“ string” ที่เสนอในการทุบตี?
ฉันพยายามรันบรรทัดใหม่โดยใช้echoและลองทำตามสองคำสั่ง: คำสั่งแรก: echo $'Hello World\nThis is a new line' การตอบสนอง: Hello World This is a new line คำสั่งที่สอง: echo $"Hello World\nThis is a new line" การตอบสนอง: Hello World\nThis is a new line คำถามของฉันคือสิ่งที่แตกต่างระหว่างสตริงห่อด้วย$' 'VS สตริงห่อด้วย$" "ในbash's echo?
9 bash  quoting  echo 

4
โปรแกรม Bash ไม่ทำงานหากการเปลี่ยนเส้นทางจะล้มเหลว
ใน bash ฉันสังเกตเห็นว่าหากคำสั่งที่ใช้การเปลี่ยนเส้นทางจะล้มเหลวโปรแกรมใด ๆ ที่ทำงานก่อนหน้านั้นจะไม่ทำงาน ตัวอย่างเช่นโปรแกรมนี้เปิดไฟล์ "a" และเขียน 50 ไบต์ไปยังไฟล์ "a" อย่างไรก็ตามการรันคำสั่งนี้ด้วยการเปลี่ยนเส้นทางไปยังไฟล์ที่มีสิทธิ์ไม่เพียงพอ (~ root / log) ทำให้ไม่มีการเปลี่ยนแปลงขนาดไฟล์ของ "a" $ ./write_file.py >> ~root/log -bash: /var/root/log: Permission denied cdal at Mac in ~/experimental/unix_write $ ls -lt total 16 -rw-rw-r-- 1 cdal staff 0 Apr 27 08:54 a <-- SHOULD BE 50 BYTES …

6
แสดงฟิสิคัลดิสก์เท่านั้นเมื่อใช้ df และ mount
เมื่อฉันใช้dfหรือmountฉันส่วนใหญ่สนใจในฟิสิคัลพาร์ติชันดิสก์ ทุกวันนี้ผลลัพธ์ของคำสั่งเหล่านั้นถูกครอบงำด้วยระบบไฟล์ชั่วคราวและเสมือนกลุ่ม cg และสิ่งอื่น ๆ ที่ฉันไม่สนใจเป็นประจำ พาร์ติชันทางกายภาพของฉันในผลลัพธ์เริ่มต้นด้วย ' /' ดังนั้นฉันพยายามสร้างนามแฝงสำหรับdfและmount: alias df1="df | egrep '^/'" alias mount1="mount | egrep '^/'" ที่ทำงาน OK สำหรับmount1(แม้ว่ามันแสดงให้เห็นว่า ' /' สีแดง) แต่สำหรับdf1ผมจะบางครั้งเหมือนจะเพิ่ม-hตัวเลือกในการและไม่สามารถทำdf df1 -hฉันไม่ต้องการมีนามแฝงสำหรับชุดค่าผสมของตัวเลือกทั้งหมดที่ฉันอาจต้องการใช้ ฉันต้องดูการกำหนดฟังก์ชั่นใน bash (ฉันไม่ต้องการ) หรือไม่? มีวิธีแก้ปัญหาที่ดีกว่าdf1หรือไม่?

3
วิธีใช้ bash builtin เพื่อแทนที่เอาต์พุตของ subshell หรือฟังก์ชัน
ฉันพยายามใช้สตริงย่อยของ bash ในตัวเพื่อแทนที่เอาต์พุตของ subshell หรือฟังก์ชัน bash อื่น คำสั่งต่อไปนี้ทำงานได้ค่อนข้างดีใน zsh; แต่ส่งผลให้เกิดbad substitutionข้อผิดพลาดในทุบตี: ${${PWD##*/}//trunk/latest} หรือ ${$(basename $PWD)//trunk/latest} ผลลัพธ์ควรเป็นโฟลเดอร์สุดท้ายของ$PWD, แทนที่ด้วยlatestเมื่อไดเรกทอรีปัจจุบันของฉันคือtrunk ดังนั้น/home/user/trunkควรเป็นlatest มีการทุบตีเทียบเท่าอนุญาตให้สายโซ่รุ่นโดยไม่ต้องอาศัยตัวแปรหรือท่อ? หรือ bash บิวด์อินอนุญาตให้อินพุตเป็นสตริงหรือตัวแปรธรรมดาเท่านั้น?
9 bash 

5
ค้นหาการเกิดขึ้นครั้งสุดท้ายของสตริงในหลายไฟล์
ฉันต้องการค้นหาไฟล์บันทึกหลายไฟล์ (ไฟล์ทั้งหมดที่สร้างใน 24 ชั่วโมงที่ผ่านมาทั้งหมดเก็บไว้ในไดเรกทอรีเดียวกัน) เพื่อค้นหาสตริงที่เกิดขึ้นครั้งล่าสุด นี่คือคำสั่งที่ฉันเขียน: find . -mtime 1 | grep fileprefix | xargs grep 'search string' | tail -1 แต่นี่จะส่งคืนบรรทัดสุดท้ายสำหรับไฟล์เดียวเท่านั้น ข้อเสนอแนะเกี่ยวกับวิธีการปรับแต่งนี้เพื่อให้ได้ทุกบรรทัด?

1
Bash: มีเซสชันที่ซ้อนกันอยู่ลึกแค่ไหน?
สมมติว่าฉันเริ่มต้นbashเชลล์ ... จากนั้นbashเซสชั่นอื่นจากภายในเชลล์นั้น ... แล้วbashเซสชั่นอื่นจากภายในเซสชั่นนั้น ... จากนั้นbashเซสชั่นอื่นจากภายในเซสชั่นนั้น ... (คูณ N) เป็นต้น ในการออกจากเซสชัน N ทั้งหมดฉันต้องพิมพ์exitN ครั้ง ฉันจะรู้ได้อย่างไรว่าตัวฉันเองซ้อนอยู่ลึกแค่ไหนในเซสชั่น bash ใด นึกคิดฉันกำลังมองหาตัวแปรสภาพแวดล้อมบางอย่างที่คล้ายกับ$STYช่วงหน้าจอ

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