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

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

3
วิธีการพิมพ์สตริงคั่นด้วย TAB ในทุบตี?
ฉันพยายามพิมพ์สองสตริงคั่นด้วย TAB ฉันเหนื่อย: echo -e 'foo\tbar' printf '%s\t%s\n' foo bar ทั้งคู่พิมพ์: foo bar โดยที่ช่องว่างระหว่างสองช่องนั้นเป็น 5 ช่องว่าง (ตามการเลือกผลลัพธ์ด้วยเมาส์ใน Putty) ฉันได้ลองใช้ CTRL + V แล้วกด TAB เมื่อพิมพ์คำสั่งด้วยผลลัพธ์เดียวกัน วิธีที่ถูกต้องในการบังคับแท็บให้พิมพ์เป็นแท็บคืออะไรฉันจึงสามารถเลือกเอาท์พุทและคัดลอกไปยังที่อื่นด้วยแท็บได้ และคำถามรอง: ทำไมทุบตีขยายแท็บลงในช่องว่าง อัปเดต : เห็นได้ชัดว่านี่เป็นปัญหาของ Putty: /superuser/656838/how-to-make-putty-display-tabs-within-a-file-instead-of-changing-them-to ช่องว่างที่

2
การเปลี่ยนเส้นทางเช่น“ |>” เป็นเพียงข้อผิดพลาดหรือมีความหมายอะไรไหม
ฉันพิมพ์โดยไม่ได้ตั้งใจ แต่ทุบตีไม่ได้พิมพ์ข้อผิดพลาดใด ๆ (แต่สร้างไฟล์เปล่า) ดังนั้นฉันคิดว่าบางทีมันอาจหมายถึงอะไรบางอย่าง? (เช่นวันที่ |> tmp.txt)

2
สร้างคำสั่งแบบไดนามิก
ฉันกำลังทำงานกับสคริปต์และฉันต้องสร้างtarคำสั่งแบบไดนามิก ต่อไปนี้เป็นสองตัวอย่างเพื่ออธิบายสิ่งที่ฉันพยายามทำ: #!/bin/bash TAR_ME="/tmp" EXCLUDE=("/tmp/hello hello" "/tmp/systemd*" "/tmp/Temp*") _tar="tar "`printf -- '--exclude="%s" ' "${EXCLUDE[@]}"`" -zcf tmp.tar.gz" echo COMMAND: "${_tar}" ${_tar} "$TAR_ME" echo -e "\n\nNEXT:\n\n" EXCLUDE=("--exclude=/tmp/hello\ hello" "--exclude=/tmp/systemd*" "--exclude=/tmp/Temp*") _tar="tar "`printf -- '%s ' "${EXCLUDE[@]}"`" -zcf test.tar.gz" echo COMMAND: "${_tar}" ${_tar} "$TAR_ME" ฉันต้องการที่จะใช้_tarเป็นคำสั่งฉันสามารถทำให้มันทำงานกับเส้นทางแบบคลาสสิก แต่ฉันต้องการมันเพื่อทำงานกับช่องว่างในชื่อโฟลเดอร์ และทุกครั้งที่ฉันพบข้อผิดพลาดที่มีลักษณะ: COMMAND: tar --exclude="/tmp/hello hello" --exclude="/tmp/systemd*" --exclude="/tmp/Temp*" …

6
เรียงลำดับทุบตีตามความยาวขององค์ประกอบ?
รับอาร์เรย์ของสตริงฉันต้องการเรียงลำดับตามความยาวของแต่ละองค์ประกอบ ตัวอย่างเช่น... array=( "tiny string" "the longest string in the list" "middle string" "medium string" "also a medium string" "short string" ) ควรจัดเรียง ... "the longest string in the list" "also a medium string" "medium string" "middle string" "short string" "tiny string" (เป็นโบนัสมันจะดีถ้ารายการเรียงสตริงที่มีความยาวเท่ากันตามลำดับตัวอักษรในตัวอย่างข้างต้นmedium stringถูกเรียงลำดับก่อนmiddle stringแม้ว่าจะมีความยาวเท่ากัน แต่นั่นไม่ใช่ข้อกำหนด "ยาก" หากซับซ้อนกว่า สารละลาย). มันก็โอเคถ้ามีการจัดเรียงอาร์เรย์ในสถานที่ …


2
ลบไฟล์ที่ไม่มีสตริงในชื่อ
ฉันต้องการลบไฟล์ที่ไม่มีสตริง '999' (ไม่มี '') ในชื่อของพวกเขา ฉันเหนื่อย: grep -vlr 999 . | xargs -0 rm -f -- find . -print0 | grep --null-data -v 999 | xargs -0 rm -- แต่ไม่มีใครทำงานเลย ฉันใช้ macOS Sierra โดยใช้ bash: 3.2.57
9 bash  osx  filenames  rm 

7
ฉันจะอ้างอิงการขยายตัวแปรภายในสตริงเพื่อหลีกเลี่ยงการแยกคำได้อย่างไร
$ myvar="/path to/my directory" $ sudo bash -c "cd $myvar" ในกรณีเช่นนี้ฉัน$myvarจะอ้างอิงเพื่อหลีกเลี่ยงการแยกคำเนื่องจากช่องว่างสีขาวในค่าของได้myvarอย่างไร
9 bash  shell  sudo  quoting 

3
วิธีการจับภาพที่อยู่ IP แรกจากคำสั่ง ifconfig?
วิธีการจับที่อยู่ IP แรกที่มาจากifconfigคำสั่ง? ifconfig -a enw178032: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 100.14.22.12 netmask 255.255.0.0 broadcast 100.14.255.255 inet6 fe80::250:56ff:fe9c:158a prefixlen 64 scopeid 0x20<link> ether 00:10:56:9c:65:8a txqueuelen 1000 (Ethernet) RX packets 26846250 bytes 12068811576 (11.2 GiB) RX errors 0 dropped 58671 overruns 0 frame 0 TX packets 3368855 bytes 1139160934 (1.0 GiB) TX …
9 linux  bash  awk  sed  ifconfig 

3
การขยายตัวเชลล์ (A | B) ในชื่อไฟล์?
เป็นไปได้หรือไม่ที่จะขยายorทางเลือกในเชลล์เมื่ออ่านไฟล์ตัวอย่าง สิ่งที่ฉันหมายถึงคือการgrepสนับสนุนไวยากรณ์ที่ต้องการ(A|B)จับคู่ A หรือ B ในไฟล์ ในทำนองเดียวกันถ้าฉันมีไฟล์เหล่านี้: file1.txt file2.txt file3.txt file4.txt file5.txt ฉันทำได้cat file{1..5}.txtในbashขณะที่มันขยายช่วง มีวิธีที่เท่าเทียมกันในการทำเช่นนี้เพียงไม่กี่ไฟล์? เช่นcat file(1|5).txtและพิมพ์ 2 เหล่านั้นเท่านั้น

1
แสดง STDOUT ก่อน STDERR หรือไม่
ฉันใหม่เพื่อทุบตีและฉันไม่สามารถให้ชีวิตของฉันคิดออกวิธีการเรียกใช้คำสั่งบางอย่างสมมติ./fffและพิมพ์ stdouts ปกติก่อน stderr (ฉันสับสนเกี่ยวกับความหมายของตัวเอง) ตัวอย่างเช่น $ printf "I am a\ndrill\n" > fff; $ cat fff nofile fff nofile fff I am a drill cat: nofile: No such file or directory I am a drill cat: nofile: No such file or directory I am a drill ต้องการพิมพ์เช่น: I am a …

10
Bash: แยกหนึ่งในสี่ส่วนของที่อยู่ IPv4
เราสามารถใช้ไวยากรณ์${var##pattern}และ${var%%pattern}แยกส่วนสุดท้ายและส่วนแรกของที่อยู่ IPv4: IP=109.96.77.15 echo IP: $IP echo 'Extract the first section using ${var%%pattern}: ' ${IP%%.*} echo 'Extract the last section using ${var##pattern}: ' ${IP##*.} เราจะแยกส่วนที่สองหรือสามของที่อยู่ IPv4 โดยใช้การขยายพารามิเตอร์ได้อย่างไร นี่คือโซลูชันของฉัน: ฉันใช้อาร์เรย์และเปลี่ยนตัวแปร IFS :~/bin$ IP=109.96.77.15 :~/bin$ IFS=. read -a ArrIP<<<"$IP" :~/bin$ echo ${ArrIP[1]} 96 :~/bin$ printf "%s\n" "${ArrIP[@]}" 109 96 77 15 นอกจากนี้ผมได้เขียนแก้ปัญหาบางอย่างใช้awk, …

7
ตรงข้ามกับคำสั่ง `source '
ฉันใช้sourceคำสั่งในสคริปต์ทุบตีของฉันเพื่ออ่าน / พิมพ์ค่าตัวแปร more linuxmachines_mount_point.txt export linuxmachine01="sdb sdc sdf sdd sde sdg" export linuxmachine02="sde sdd sdb sdf sdc" export linuxmachine03="sdb sdd sdc sde sdf" export linuxmachine06="sdb sde sdf sdd" source linuxmachines_mount_point.txt echo $linuxmachine01 sdb sdc sdf sdd sde sdg อะไรคือสิ่งที่ตรงกันข้ามsourceเพื่อยกเลิกการตั้งค่าตัวแปร? ผลลัพธ์ที่คาดหวัง echo $linuxmachine01 < no output >

2
จะทำให้การอ่านและเขียนไฟล์เดียวกันในไปป์ไลน์เดียวกันเสมอ“ ล้มเหลว” ได้อย่างไร?
ว่าฉันมีสคริปต์ต่อไปนี้: #!/bin/bash for i in $(seq 1000) do cp /etc/passwd tmp cat tmp | head -1 | head -1 | head -1 > tmp #this is the key line cat tmp done ในบรรทัดสำคัญฉันอ่านและเขียนไฟล์เดียวกันtmpซึ่งบางครั้งล้มเหลว (ฉันอ่านมันเป็นเพราะสภาพการแข่งขันเพราะกระบวนการในไปป์ไลน์ถูกดำเนินการแบบขนานซึ่งฉันไม่เข้าใจว่าทำไม - แต่ละคนheadจำเป็นต้องใช้ข้อมูลจากข้อมูลก่อนหน้านี้ใช่ไหมนี่ไม่ใช่คำถามหลักของฉัน แต่คุณสามารถตอบได้เช่นกัน) เมื่อฉันเรียกใช้สคริปต์มันจะส่งออกประมาณ 200 บรรทัด มีวิธีใดบ้างที่ฉันสามารถบังคับให้สคริปต์นี้ให้ผลลัพธ์เสมอ 0 บรรทัด (ดังนั้นการเปลี่ยนเส้นทาง I / O ไปยังจะtmpถูกเตรียมไว้ก่อนเสมอและข้อมูลจะถูกทำลายเสมอ) เพื่อความชัดเจนฉันหมายถึงการเปลี่ยนการตั้งค่าระบบไม่ใช่สคริปต์นี้ ขอบคุณสำหรับความคิดของคุณ

3
ทำให้ข้อความหายไปหลังจากที่ผู้ใช้ป้อน
มีวิธีที่คุณสามารถทำให้เนื้อหาที่แสดงหายไปหลังจากที่ผู้ใช้ป้อนข้อมูลหรือไม่ ตัวอย่างเช่นใช้ไฟล์นี้ด้านล่าง #!/bin/bash read -n 1 -p 'how are you ? ' var if [ "$var" == "y" ] then echo 'Have fun' else echo 'Go to Doctor' fi หากคุณเรียกใช้สิ่งนี้ผลลัพธ์คือ how are you ? yHave fun ฉันกำลังมองหาบางอย่างที่ทำให้ฉันhow are you ?หายไปทันทีที่ผู้ใช้กดปุ่ม และหลังจากหายไปพิมพ์ Have fun ดังนั้นฉันต้องการผลลัพธ์สุดท้ายของโปรแกรมข้างต้นเป็นเพียง Have fun หมายเหตุ: นอกจากนี้สิ่งใดที่อยู่เหนือสคริปต์นี้ที่พิมพ์บนหน้าจอเชลล์ไม่ควรลบ ฉันใช้ bash
9 bash  scripting 

6
(bash) สคริปต์ A รอสคริปต์ B แต่ไม่ใช่กระบวนการลูก
ดังนั้นฉันจึงมี scriptA ซึ่ง: ssh server1 -- scriptB & ssh server2 -- scriptB & ssh server3 -- scriptB & wait otherstuffhappens ScriptB ทำ: rsync -av /important/stuff/. remoteserver:/remote/dir/. rsync -av /not/so/important/stuff/. remoteserver:/remote/dir/. & exit ผลลัพธ์ที่ฉันต้องการคือ scriptA จะรอให้อินสแตนซ์ทั้งหมดของ scriptB เสร็จสิ้นก่อนที่จะดำเนินการต่อไปซึ่งมันทำอยู่ในขณะนี้ ไฟล์เหล่านี้เป็นไฟล์ขนาดใหญ่ที่ฉันไม่ต้องการรอ ฉันได้อ่านความแตกต่างระหว่าง nohup, บอกเลิกและ &และลองชุดค่าผสมที่แตกต่างกัน แต่ฉันไม่ได้รับผลลัพธ์ที่ต้องการ ณ จุดนี้ฉันค่อนข้างนิ่งงัน ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม!

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