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

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

3
วิธีอ่านบรรทัดต่าง ๆ ของไฟล์ไปยังตัวแปรต่าง ๆ
ฉันต้องการที่จะอ่านบรรทัดที่แตกต่างกันของไฟล์ข้อความไปยังตัวแปรที่แตกต่างกัน ตัวอย่างเช่น input.txt: line1 foo foobar bar line2 bar line3 foo line4 foobar bar ฉันต้องการผลนี้จะถูกเก็บไว้ในตัวแปรvar1, var2, var3และvar4เช่นว่า var1=line1 foo foobar bar var2=line2 bar และอื่น ๆ ใครช่วยได้โปรดบอกฉันว่ามันจะทำอย่างไร ฉันพยายามที่จะใช้evalในวงสำหรับ ดูเหมือนจะไม่ทำงาน
14 bash 

3
วิธีการยกเว้นบางไฟล์จากกลไกการขยายชื่อไฟล์ในทุบตี?
ฉันมีไดเรกทอรีระบบไฟล์ Ubuntu ในไดเรกทอรีรากและฉันตั้งใจคัดลอกหลายร้อยไฟล์ลงในไดเรกทอรีราก ฉันพยายามลบไฟล์ที่คัดลอกโดยไม่รวมระบบไฟล์เช่น rm -rf !{bin,sbin,usr,opt,lib,var,etc,srv,libx32,lib64,run,boot,proc,sys,dev} ./. บุมันไม่ทำงาน วิธีที่เหมาะสมในการยกเว้นไดเรกทอรีบางรายการในขณะที่ลบทั้งรายการคืออะไร แก้ไข: อย่าลองคำสั่งใด ๆ ที่นี่โดยไม่รู้ว่าจะทำอย่างไร!

4
คำสั่ง exit ทำงานบนเทอร์มินัล Unix อย่างไร
ใครช่วยกรุณาอธิบายว่าexitคำสั่งทำงานอย่างไรในเทอร์มินัล Unix? การค้นหาman exit และwhich exitไม่เป็นประโยชน์และฉันได้เจอปัญหาต่อไปนี้ หลังจากติดตั้ง add บนแพ็คเกจสำหรับ Anaconda และ PyCharm ในระบบ Red Hat ใหม่ของฉันฉันสังเกตเห็นว่าเมื่อใดก็ตามที่ฉันถูกเรียกexitให้ออกจากเซสชันเทอร์มินัลฉันจะได้รับข้อผิดพลาดหลายชุดจากนั้นเทอร์มินัลจะหยุด ข้อผิดพลาดดูเหมือนจะแนะนำว่าการโทรของฉันexitกำลังเรียกการโทรrm ~/anaconda3/.../และrm ~/PyCharm/....ทำให้เกิดข้อผิดพลาด ไดเรกทอรีทั้งหมดดูเหมือนจะเป็นที่ตั้งของแพ็คเกจที่ฉันดาวน์โหลดสำหรับโปรแกรมเหล่านี้ (เช่นจำนวนมาก) ดูด้านล่าง $ exit rm: cannot remove ‘~/anaconda3/lib/python3.5/site-packages/numpy/core’: Is a directory ... ... การแก้ไข ใน~/.bash_logoutไฟล์ของฉันมีบรรทัด find ~ -xdev ( -name *~ -o -name .*~ -o -name core ) -exec \rm …

2
วิธีการส่งพารามิเตอร์เพื่อทำงานในสคริปต์ทุบตี?
ฉันต้องการเขียนฟังก์ชั่นที่ฉันสามารถโทรหาจากสคริปต์ที่มีตัวแปรต่าง ๆ มากมาย ด้วยเหตุผลบางอย่างฉันมีปัญหาในการทำเช่นนี้ ตัวอย่างที่ฉันอ่านเสมอใช้ตัวแปรทั่วโลก แต่นั่นจะไม่ทำให้โค้ดของฉันอ่านง่ายขึ้นเท่าที่ฉันเห็น ตัวอย่างการใช้งานที่ตั้งใจไว้: #!/bin/bash #myscript.sh var1=$1 var2=$2 var3=$3 var4=$4 add(){ result=$para1 + $para2 } add $var1 $var2 add $var3 $var4 # end of the script ./myscript.sh 1 2 3 4 ฉันลองใช้$1และในฟังก์ชั่น แต่หลังจากนั้นมันก็ใช้ทั่วโลกที่สคริปต์ทั้งหมดถูกเรียกจาก โดยทั่วไปสิ่งที่ฉันกำลังมองหาสิ่งที่ต้องการ$1, $2และอื่น ๆ แต่ในบริบทของท้องถิ่นของฟังก์ชั่น ฟังก์ชั่นทำงานในภาษาที่เหมาะสม

5
หนึ่งจะแยกสถานะการออกของคำสั่งลงในตัวแปรได้อย่างไร
ฉันเริ่มเรียนรู้การทุบตีเมื่อสองสามวันก่อน ฉันพยายามรับสถานะทางออกของgrepการแสดงออกเป็นตัวแปรเช่นนี้ check=grep -ci 'text' file.sh และผลลัพธ์ที่ฉันได้รับคือ No command '-ic' found ฉันควรทำด้วยคำสั่งไพพ์หรือไม่?

3
ทุบตี: ฉันยากจน [[<]]
ฉันกำลังเขียนสคริปต์ทุบตีและทันใดนั้นพฤติกรรมนี้ก็เริ่มต้น: [[ 1 &lt; 2 ]]; echo $? # outputs 0 [[ 2 &lt; 13 ]]; echo $? # outputs 1 แต่ใช้-ltงานได้ดี: [[ 1 -lt 2 ]]; echo $? # outputs 0 [[ 2 -lt 13 ]]; echo $? # outputs 0 ฉันเขียนทับ&lt;อย่างใดโดยบังเอิญหรือไม่? นี่คือสคริปต์ที่ฉันเขียนเพื่อทดสอบพฤติกรรมนี้: #!/bin/bash for a in {1..5} do …
14 bash  test 

1
มีวิธีใดที่จะบอกได้ว่าเชลล์สคริปต์ถูกฆ่าด้วยสัญญาณ 9
ฉันมีสคริปต์ทุบตี (เรียกจากโปรแกรมจาวา) ที่ยังคงถูกฆ่า ฉันมักจะจับsignal 15ด้วยtrapแต่แล้วบางส่วนสัญญาณอื่น ๆ ที่มาพร้อมที่ฉันสงสัยว่าเป็นแต่ฉันในพื้นตาบอดเป็นไปได้ถ้ามันเป็นจริงsignal 9signal 9 ฉันรู้ว่าคุณไม่สามารถtrap signal 9มีวิธีอื่นที่ฉันสามารถบอกได้ว่าsignal 9กำลังฆ่าเชลล์สคริปต์ของฉันหรือไม่

3
ฉันจะทำงานกับไบนารีใน bash เพื่อคัดลอกไบต์คำต่อคำโดยไม่มีการแปลงได้อย่างไร
ฉันพยายามแปลรหัส c ++ เป็น bash อย่างทะเยอทะยานด้วยเหตุผลมากมาย รหัสนี้อ่านและจัดการไฟล์ประเภทเฉพาะสำหรับฟิลด์ย่อยของฉันที่เขียนและจัดโครงสร้างอย่างสมบูรณ์ในไบนารี งานที่เกี่ยวข้องกับไบนารีครั้งแรกของฉันคือการคัดลอกส่วนหัว 988 ไบต์แรกตามที่เป็นจริงและใส่ลงในไฟล์เอาต์พุตที่ฉันสามารถเขียนต่อไปได้ในขณะที่ฉันสร้างข้อมูลที่เหลือ ฉันค่อนข้างมั่นใจว่าโซลูชันปัจจุบันของฉันใช้งานไม่ได้และในความเป็นจริงฉันไม่ได้คิดวิธีที่ดีในการพิจารณาสิ่งนี้ ดังนั้นแม้ว่ามันจะถูกเขียนขึ้นอย่างถูกต้องฉันต้องรู้ว่าฉันจะทดสอบสิ่งนี้อย่างไรเพื่อให้แน่ใจ! นี่คือสิ่งที่ฉันกำลังทำอยู่ตอนนี้: hdr_988=`head -c 988 ${inputFile}` echo -n "${hdr_988}" &gt; ${output_hdr} headInput=`head -c 988 ${inputTrack} | hexdump` headOutput=`head -c 988 ${output_hdr} | hexdump` if [ "${headInput}" != "${headOutput}" ]; then echo "output header was not written properly. exiting. please …
14 bash  binary  head 

4
การทุบตีเสร็จสมบูรณ์ไม่สมบูรณ์ใน centos 7
yum install --enablerepo=epel bash-completionผมได้ติดตั้งเสร็จสิ้นทุบตีใช้ ในขณะที่ใช้งานได้กับคำสั่งพื้นฐานบางอย่าง (git &amp; yum) แต่ฉันก็ขาดคอมไพเลอร์ส่วนใหญ่ไป ฉัน/etc/bash_completion.dมีดังต่อไปนี้: bash_completion.d] $ ls git iprutils redefine_filedir yum yummain.py yum-utils.bash แต่ผมรู้ว่ามี bash_completion สำหรับ IE แต่งหน้า (ซึ่งมีการติดตั้ง) และอื่น ๆ อีกมากมายการเปรียบเทียบเช่นกับผลลัพธ์ตัวอย่างที่นี่ ฉันจะรับสคริปต์คอมไพเลอร์ที่ขาดหายไปได้อย่างไร (โดยเฉพาะกับ yum ดังนั้นฉันไม่ต้องอัปเดตด้วยตนเอง) หากเป็นเรื่อง: การทำให้แท็บเสร็จสมบูรณ์ แต่ฉันไม่ได้จัดหาอะไรใน. bashrc ของฉัน มันเพิ่งเริ่มทำงานหลังจากติดตั้งแพคเกจ UPDATE:หลังจากตรวจสอบเวอร์ชั่นของ bash เสร็จแล้วฉันได้ติดตั้งตามที่ @fduff แนะนำแล้วฉันเห็นสิ่งต่อไปนี้: ติดตั้ง $ yum list | การเติม grep …

5
ฉันจะค้นหาไดเรกทอรีที่ขาดหายไปเป็นครั้งแรกในเส้นทางที่ยาวได้อย่างไร
ลองนึกภาพฉันมีเส้นทางที่ไม่มีอยู่: $ ls /foo/bar/baz/hello/world ls: cannot access /foo/bar/baz/hello/world: No such file or directory แต่ขอบอกว่า/foo/bar ไม่มีอยู่ มีวิธีที่รวดเร็วสำหรับฉันในการพิจารณาว่าbazเป็นจุดแตกหักในเส้นทางหรือไม่ ฉันกำลังใช้ Bash
14 bash  shell  directory  ls 

8
ตรวจสอบตัวแปรเป็นอาร์เรย์ใน Bourne like shell หรือไม่
ใน Bourne like shell ซึ่งสนับสนุนตัวแปรอาเรย์เราสามารถใช้การวิเคราะห์คำเพื่อตรวจสอบว่าตัวแปรเป็นอาร์เรย์หรือไม่ a=(1 2 3)คำสั่งทั้งหมดด้านล่างนี้ถูกเรียกใช้หลังจากการทำงาน zsh: $ declare -p a typeset -a a a=( 1 2 3 ) bash: $ declare -p a declare -a a='([0]="1" [1]="2" [2]="3")' ksh93: $ typeset -p a typeset -a a=(1 2 3) pdksh และอนุพันธ์: $ typeset -p a set -A a …
14 bash  shell  zsh  ksh  yash 

3
ชื่อไฟล์ 'find -exec' pass มีช่องว่างอย่างไร
หากฉันมีไดเรกทอรีที่มีไฟล์บางไฟล์ที่ชื่อมีช่องว่างเช่น $ ls -1 dir1 file 1 file 2 file 3 ฉันสามารถคัดลอกทั้งหมดไปยังไดเรกทอรีอื่นเช่นนี้ได้สำเร็จ: $ find dir1 -mindepth 1 -exec cp -t dir2 {} + อย่างไรก็ตามการส่งออกของfind dir1 -mindepth 1มีช่องว่างที่ไม่หนี: $ find dir1 mindepth 1 dir1/file 1 dir1/file 3 dir1/file 3 หากฉันใช้print0แทนprintเอาต์พุตยังคงมีช่องว่างที่ไม่ได้ใช้ Escape: $ find dir1 mindepth 1 -print0 dir1/file 1dir1/file 2dir1/file 3 …

2
วิธีที่เร็วที่สุดในการลบรายการที่ซ้ำกันในรายการคำศัพท์ขนาดใหญ่?
ฉันต้องทำรายการคำซ้ำให้ซ้ำซ้อน ฉันลองใช้หลายคำสั่งและทำการวิจัยที่นี่และที่นี่ซึ่งพวกเขาอธิบายว่าวิธีที่เร็วที่สุดในการขจัดความซ้ำซ้อนของรายการคำดูเหมือนจะใช้ awk awk -&gt; O (n)? จัดเรียง -&gt; O (n บันทึก n)? อย่างไรก็ตามฉันพบว่าสิ่งนี้ดูเหมือนจะไม่เป็นความจริง นี่คือผลการทดสอบของฉัน: sort -u input.txt -o output.txt จริง 0m12.446s ผู้ใช้ 0m11.347s sys 0m0.906s awk '!x[$0]++' input.txt &gt; output.txt ผู้ใช้0m47.221s จริง0m45.419s sys 0m1.260s ดังนั้นการใช้ sort -u จึงเร็วกว่า 3.7 เท่า ทำไมนี้ มีวิธีที่เร็วยิ่งขึ้นในการทำซ้ำซ้อน? *********** อัปเดต ******** เมื่อมีคนชี้ให้เห็นในความคิดเห็นอาจเป็นไปได้ว่ารายการคำศัพท์ของฉันเรียงลำดับแล้วบ้าง เพื่อแยกความเป็นไปได้นี้ฉันสร้าง wordlist สองรายการโดยใช้สคริปต์ …
14 bash  awk  performance  sort 

5
จะรับค่าสัมบูรณ์โดยใช้ awk ได้อย่างไร
หากฉันมีวันที่ด้านล่างสองวัน: 2015-09-12,2015-08-13 และฉันต้องการได้จำนวนวันระหว่างพวกเขาฉันจะใช้รหัสด้านล่าง: awk -F'[-,]' '{print 360*($4-$1)+30*($5-$2)+($6-$3)}' ผลลัพธ์สำหรับรหัสนี้จะเป็น-29จริงในขณะที่ความแตกต่างคือ29

1
เหตุใดการขยายพารามิเตอร์ bash ไม่ทำงานในไฟล์เซอร์วิส systemd
ฉันกำลังพยายามที่จะใช้systemd's EnvironmentFileและเพิ่มตัวเลือกในการคำสั่งเมื่อมีการตั้งค่าในแฟ้ม ฉันมีต่อไปนี้ในไฟล์หน่วย: ExecStart=/usr/bin/bash -c "echo ${PORT:+port is $PORT}" ซึ่งไม่ได้สะท้อนอะไรเลยเมื่อฉันเริ่มให้บริการ งานต่อไปนี้เป็นไปตามที่คาดไว้: ExecStart=/usr/bin/bash -c "echo port is $PORT" ซึ่งหมายความว่าไฟล์อ่านอย่างถูกต้อง การทดแทนพารามิเตอร์ยังทำงานบนบรรทัดคำสั่ง: $ PORT=1234 bash -c 'echo ${PORT:+port is $PORT}' port is 1234 ฉันกำลังคิดถึงอะไร

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