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

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

4
ไม่พบคำสั่ง realpath
ฉันมี debian บีบ amd64 เปลือกปัจจุบันของฉันคือทุบตี ถ้าฉันเขียนสิ่งต่อไปนี้ในเครื่องเทอร์มินัลมันใช้งานได้ $ uname -a Linux core 2.6.32-5-amd64 #1 SMP Fri May 10 08:43:19 UTC 2013 x86_64 GNU/Linux $ echo $SHELL /bin/bash $ echo $(realpath test.sh) /home/ffortier/test.sh ไฟล์ test.sh ของฉันมีลักษณะดังนี้: #!/bin/bash echo $(realpath "$1") หากฉันพยายามที่จะดำเนินการต่อไปนี้ฉันได้รับข้อผิดพลาด $ ./test.sh test.sh ./test.sh: line 2: realpath: command not found ฉันจะใช้คำสั่ง …
24 linux  bash  debian 

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

3
เรียกใช้คำสั่งแบบสุ่ม
ฉันต้องการเรียกใช้หนึ่งในสองคำสั่งC1และC2โดยการสุ่ม ฉันจะทำเช่นนั้นใน commandline (bash) ได้อย่างไร จะซาบซึ้งถ้าเป็นไปได้หนึ่งซับ
24 bash  random 

3
ในสคริปต์ bash shell ให้เขียน a for loop ที่วนซ้ำค่าสตริง
ใน bash ฉันรู้ว่ามันเป็นไปได้ที่จะเขียนforloop ซึ่งตัวแปรควบคุมการiวนซ้ำนั้นวนซ้ำตามจำนวนเต็มที่ระบุ ตัวอย่างเช่นฉันสามารถเขียน bash shell script ที่พิมพ์จำนวนเต็มระหว่าง 1 ถึง 10: #!/bin/bash for i in {1..10} do echo $i done เป็นไปได้หรือไม่ที่จะวนซ้ำตัวแปรการควบคุมลูปที่เป็นสตริงแทนถ้าฉันจัดเตรียมรายการสตริง? ตัวอย่างเช่นสมมติว่าฉันมีสตริงfnameที่แสดงชื่อไฟล์ ฉันต้องการเรียกชุดคำสั่งสำหรับแต่ละชื่อไฟล์ ตัวอย่างเช่นฉันอาจต้องการพิมพ์เนื้อหาของการfnameใช้คำสั่งเช่นนี้: #!/bin/bash for fname in {"a.txt", "b.txt", "c.txt"} do echo $fname done กล่าวอีกนัยหนึ่งในการทำซ้ำครั้งแรกfnameควรมีค่าfname="a.txt"ในขณะที่การทำซ้ำครั้งที่สองfnameควรมีค่าfname="b.txt"และอื่น ๆ น่าเสียดายที่ดูเหมือนว่าไวยากรณ์ข้างต้นไม่ถูกต้องนัก ฉันต้องการได้รับผลลัพธ์: a.txt b.txt c.txt แต่เมื่อฉันลองรหัสข้างต้นฉันได้ผลลัพธ์นี้: {a.txt, b.txt, c.txt} คุณช่วยฉันในการกำหนดไวยากรณ์ที่ถูกต้องเพื่อที่ฉันจะสามารถเปลี่ยนค่า / เนื้อหาของตัวแปรได้fnameหรือไม่? …
24 bash  shell-script  for 

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 )

16
“ คั่นหน้า” เพื่อทุบตี
การนำทางหลายชั้นของไดเรกทอรีที่ซ้อนกันมักจะเจ็บปวด บน Firefox นั้นเป็นเรื่องง่ายเพราะมีบุ๊กมาร์ก ดังนั้นสิ่งที่ฉันต้องการทำเพื่อคั่นหน้าไฟล์คือการพิมพ์: $ go --add classes "repo/www/public/util/classes" จากนั้นไปที่ไดเรกทอรีนี้ฉันจะพิมพ์: $ go classes ก่อนหน้านี้ฉันใช้ลิงก์สัญลักษณ์เพื่อให้ได้สิ่งที่คล้ายกัน แต่ฉันไม่ต้องการทำให้ไดเรกทอรีบ้านของคุณยุ่งเหยิง มีคุณสมบัติอื่น ๆ อีกมากมายที่สามารถพิสูจน์ได้ว่ามีประโยชน์ ตัวอย่างเช่นฉันต้องการเริ่มพิมพ์go clแล้วกด tab เพื่อเติมข้อความอัตโนมัติ บางครั้งฉันมีที่เก็บหลายชุดถูกเช็กเอาต์และดังนั้นจึงเป็นประโยชน์สำหรับโปรแกรมที่จะอนุญาตให้ฉันสร้างบริบทหลายชุดและตั้งค่าบุ๊กมาร์กที่สัมพันธ์กับไดเรกทอรีฐานบริบท ดังนั้นก่อนที่ฉันจะปูทางด้วยชุดสคริปต์ของตัวเองด้วยกันมีอะไรแบบนี้ไหม
24 bash  shell 

4
แบ่งปันชื่อแทนและการตั้งค่าเส้นทางระหว่าง zsh และ bash
zshเปลือกที่ผมปกติใช้เป็น ฉันมีนามแฝงหลายสีเพื่อเปิดใช้งานในโปรแกรมบางอย่างเช่นและls grepฉันได้กำหนดเส้นทางที่กำหนดเองเพื่อให้ฉันสามารถเรียกใช้งานโปรแกรมในสถานที่ที่ไม่ได้มาตรฐาน (เช่นใน~/bin/) ฉันจะไม่เปลี่ยนเปลือกรากไปzshแต่ฉันต้องการที่จะแบ่งปันการตั้งค่าเหล่านี้เพื่อให้รากที่สามารถมีได้เช่นกัน ผมพบว่าไม่ได้มีการจัดหาzsh /etc/profileฉันสามารถหามาได้/etc/zsh/zprofileแต่ฉันต้องการวิธีที่เหมาะสมกว่า
24 shell  bash  zsh  path  alias 

6
วิธีเพิ่มฟังก์ชั่นไปยัง. bash_profile / .profile / bashrc ในเชลล์?
ฉันมีฟังก์ชั่นที่แปลงเวลาของยุคปัจจุบัน นี่คือคำจำกัดความ date1(){ date -d @$1 } ฉันต้องการเขียน: $ date1 xxxyyy โดยที่ xxxyyy เป็นพารามิเตอร์ที่ฉันส่งผ่านเข้าไปในฟังก์ชั่นของฉันดังนั้นฉันจะได้รับวันที่ที่สอดคล้องกัน ฉันเข้าใจว่าฉันต้องเพิ่มทั้งใน.bash_profile, .profileหรือ.bashrcแล้วแหล่งที่มาของมัน $ source file แต่ฉันไม่แน่ใจว่าจะใส่ไฟล์ไหนในปัจจุบันฉันมี.profileแล้ว แต่เพื่อให้ทำงานได้ฉันต้องทำsource .profileทุกครั้ง เป็นการดีที่ควรทำให้พร้อมใช้งานเมื่อคอมพิวเตอร์เริ่มทำงานเหมือนตัวแปรสภาพแวดล้อม
24 bash  shell  function  profile 

3
ฉันจะตั้งค่าการอนุญาตซ้ำ ๆ บน dir (โดยเปิดใช้งาน ACL) ได้อย่างไร
ตัวอย่างเช่นฉันต้องการให้เพื่อนร่วมงานของฉันเขียนเพื่อเข้าถึงไดเรกทอรีบางอย่าง สมมติว่าไดเรกทอรีย่อยในนั้นมีสิทธิ์การเข้าถึง 775 ไฟล์ 664 และมีไฟล์ปฏิบัติการใน dir - 775 ตอนนี้ฉันต้องการเพิ่มสิทธิ์การเขียน ด้วย chmod ฉันสามารถลองสิ่งที่ชอบ chmod o+w -R mydir/ แต่นั่นก็ไม่เจ๋งเพราะฉันไม่ต้องการทำให้โลกเขียนได้ - ฉันต้องการให้สิทธิ์การเข้าถึงแก่ผู้ใช้บางคนเท่านั้นดังนั้นฉันจึงต้องการใช้ ACL แต่มีวิธีง่ายๆในการตั้งค่าการอนุญาตเหล่านั้นหรือไม่ ตามที่ฉันเห็นฉันต้องจัดการอย่างน้อยสามกรณี (dirs, ไฟล์, ไฟล์เรียกทำงาน) แยกจากกัน: find -type d -exec setfacl -m u:colleague:rwx {} \; find -type f -executable -exec setfacl -m u:colleague:rwx {} \; find -type f \! …
24 linux  bash  permissions  acl 


2
ทำไม Bash ต้นทางระยะไกล. Bash_profile แทนที่จะเป็น. bashrc
คู่มือทุบตีพูดว่า: Bash พยายามที่จะกำหนดว่าเมื่อใดที่มันถูกรันด้วยอินพุตมาตรฐานที่เชื่อมต่อกับการเชื่อมต่อเครือข่ายเช่นเดียวกับเมื่อดำเนินการโดย remote shell daemon โดยปกติคือ rshd หรือ secure shell daemon sshd หาก Bash ระบุว่ากำลังรันในโหมดนี้มันจะอ่านและดำเนินการคำสั่งจาก ~ / .bashrc หากไฟล์นั้นมีอยู่และอ่านได้ แหล่งข้อมูล Bash นี้~/.bashrc: ssh user@host : แต่แหล่ง Bash นี้~/.bash_profile: ssh user@host ฉันไม่เห็นความแตกต่างในสองคำสั่งนี้ตามข้อกำหนด ทั้งสองกรณีไม่ได้เชื่อมต่อ stdin กับการเชื่อมต่อเครือข่ายหรือไม่
24 bash  ssh 

3
ตัวดำเนินการเชิงตรรกะหลายตัว ((A || B) && C) และ“ ข้อผิดพลาดทางไวยากรณ์ใกล้โทเค็นที่ไม่คาดคิด”
ฉันทำงานกับ Bash 3 และฉันพยายามสร้างเงื่อนไข ใน C / C ++ มันง่ายที่ตายแล้ว: ((A || B) && C). ใน Bash มันไม่เป็นเช่นนั้น (ฉันคิดว่าผู้แต่ง Git ต้องมีส่วนร่วมในรหัสนี้ก่อนที่จะย้ายไปสู่ความพยายามอื่น ๆ ) สิ่งนี้ใช้ไม่ได้ โปรดทราบว่า<0 or 1>ไม่ใช่ตัวอักษรสตริง; มันหมายถึง 0 หรือ 1 (โดยทั่วไปมาจากgrep -i) A=<0 or 1> B=<0 or 1> C=<0 or 1> if [ [ "$A" -eq "0" ] || …

9
แสดงเฉพาะ stderr บนหน้าจอ แต่เขียนทั้ง stdout และ stderr ไปยังไฟล์
ฉันจะใช้ BASH Magic เพื่อให้ได้สิ่งนี้ได้อย่างไร ฉันต้องการเห็นเฉพาะ stderr output บนหน้าจอ แต่ฉันต้องการให้ stdout และ stderr เขียนลงไฟล์ ชี้แจง: ฉันต้องการให้ทั้ง stdout และ stderr สิ้นสุดในไฟล์เดียวกัน ตามลำดับที่เกิดขึ้น น่าเสียดายที่ไม่มีคำตอบด้านล่างทำสิ่งนี้

8
เป็นไปได้หรือไม่ที่จะตรวจสอบว่ามีการกำหนดนามแฝงหรือไม่?
นามแฝงเช่นllถูกกำหนดด้วยaliasคำสั่ง ฉันสามารถตรวจสอบคำสั่งด้วยสิ่งต่าง ๆtype llที่พิมพ์ได้ ll is aliased to `ls -l --color=auto' หรือcommand -v llที่พิมพ์ alias ll='ls -l --color=auto' หรือalias llที่พิมพ์ alias ll='ls -l --color=auto' แต่ฉันไม่สามารถหาตำแหน่งที่กำหนดนามแฝงได้เช่นไฟล์เช่น.bashrcหรืออาจด้วยตนเองในเชลล์ที่กำลังรัน ณ จุดนี้ฉันไม่แน่ใจว่าจะเป็นไปได้ ฉันควรผ่านไฟล์ทั้งหมดที่โหลดbashและตรวจสอบไฟล์ทุกไฟล์หรือไม่?
24 bash  terminal  bashrc 

4
ระบุไฟล์ที่มีอักขระที่ไม่ใช่ ASCII หรือไม่สามารถพิมพ์ได้ในชื่อไฟล์
ในไดเรกทอรีขนาด 80GB ที่มีประมาณ 700,000 ไฟล์มีชื่อไฟล์บางส่วนที่มีอักขระที่ไม่ใช่ภาษาอังกฤษในชื่อไฟล์ นอกเหนือจากการสืบค้นผ่านรายการไฟล์อย่างตั้งใจแล้ว: วิธีง่ายๆในการแสดงรายการหรือระบุชื่อไฟล์เหล่านี้คืออะไร? วิธีสร้างตัวอักษรที่ไม่ใช่ภาษาอังกฤษที่พิมพ์ได้ - ตัวอักษรเหล่านั้นที่ไม่ได้อยู่ในช่วงที่พิมพ์ได้man ascii(ดังนั้นฉันสามารถทดสอบว่าไฟล์เหล่านี้ถูกระบุ)?

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