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

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

2
การต่อสตริงสตริง Bash ใช้เพื่อสร้างรายการพารามิเตอร์
รับชิ้นส่วนทุบตีนี้: PARMS='-rvu' PARMS+=" --delete --exclude='.git'" echo $PARMS rsync ${PARMS} . ${TARGET} echo แสดงสตริง PARMS ตามที่คาดไว้จะไม่มีข้อผิดพลาดปรากฏขึ้น แต่ rsync จะทำหน้าที่อย่างเงียบ ๆ ราวกับไม่มีตัวเลือกที่เพิ่มโดย + = อยู่ อย่างไรก็ตามทำงานได้ตามที่คาดไว้: PARMS='-rvu' rsync ${PARMS} --delete --exclude='.git' . ${TARGET} ฉันเดาว่าฉันทำอะไรบางอย่างกับคำพูดทุบตี (มักจะมีปัญหากับสิ่งเหล่านั้น) แต่ไม่แน่ใจว่าอะไรและทำไมตัวเลือกถูกละเว้นแม้ว่าสตริงดูเหมือนว่าจะถูกสร้างขึ้นอย่างถูกต้อง

2
สร้างลิงก์สัญลักษณ์แบบสัมบูรณ์ไปยังไดเร็กทอรีปัจจุบัน
ตอนนี้ฉันอยู่ภายใต้ไดเรกทอรีที่มีเส้นทางที่ยาวมาก สำหรับการเยี่ยมชมในอนาคตนั้นเร็วกว่าฉันต้องการสร้างลิงก์ให้ ฉันเหนื่อย ln -s . ~/mylink ~/mylinkเชื่อมโยงไปยัง~จริง ฉันจะขยาย~เข้าไปในชื่อพา ธ ที่ล้าสมัยแล้วให้มันได้lnหรือไม่
12 shell  symlink  cwd 

1
เกี่ยวกับแบบพกพา sed -e ... db หรือ! ข?
ในการแก้ไข นี้Stéphane Chazelas POSIXify (อีกครั้ง)sedการจัดรูปแบบของฉันโดยการแทรกตัว-eแบ่ง xpression และ-eคำสั่ง xpression อื่น ตอนนี้ฉันอาจจะถามเขาว่าทำไมในความคิดเห็นฉันคิดว่า แต่มันก็มีการแก้ไขหมายเลข 18 ในคำตอบนั้นและเกือบทั้งหมดก่อนหน้านี้แล้วขอบคุณฟรีคล้ายกัน(ถ้าคุณสามารถเห็นความคิดเห็นที่ถูกลบคุณจะรู้ว่าสิ่งที่ ผมหมายถึง) นอกจากนี้ฉันคิดว่าฉันเข้าใกล้พอที่จะเข้าใจว่าทำไมวลีนี้ด้วยวิธีที่อาจมีประโยชน์มากกว่า ดังนั้นนี่คือความหวัง ... ฉันมักชอบที่จะให้ทั้งหมดของฉันsed -eXpressions ไปหนึ่งถ้าฉันอาจ แต่ฉันยังมีการตั้งค่ามากขึ้นสำหรับการเป็นไปตามสเปคที่ใกล้เท่าที่จะทำได้โดยเฉพาะอย่างยิ่งเมื่อความแตกต่างจะมีจำนวนไม่เกินและ<space> -eแต่ฉันไม่สามารถทำได้ถ้าฉันไม่เข้าใจว่าทำไมฉันควรทำ นี่เป็นบทสรุปสั้น ๆ เกี่ยวกับสถานะปัจจุบันของความเข้าใจของฉัน: ' -e 'แบ่ง portably สามารถยืนอยู่ในสำหรับsedสคริปต์\nแบ่ง ewline ในsedคำสั่งบรรทัดคำสั่ง ... ฉันยอมรับคลุมเครือเกี่ยวกับสาเหตุ วงเล็บปีกกาปิดในsed {ฟังก์ชั่น}จะต้องนำหน้าด้วยตัว\nแบ่ง ewline ตามที่ระบุไว้ที่นี่: <right-brace>จะนำหน้าด้วย<newline>และสามารถนำหน้าหรือตาม<blank>ตัวอักษร \nแบ่ง ewline เป็นสิ่งจำเป็นในทำนองเดียวกันต่อไปนี้การใช้งานใด ๆ ... a, b, c, i, r, t, …
12 shell  sed  posix 

7
ซีเรียลไลซ์ตัวแปรเชลล์ใน bash หรือ zsh
มีวิธีใดในการทำให้เชลล์เชลล์เป็นอนุกรม? สมมติว่าฉันมีตัวแปร$VARและฉันต้องการที่จะสามารถบันทึกลงในไฟล์หรืออะไรก็ตามแล้วอ่านมันอีกครั้งในภายหลังเพื่อรับค่าเดียวกันกลับมา? มีวิธีพกพาในการทำเช่นนี้? (ฉันไม่คิดอย่างนั้น) มีวิธีทำใน bash หรือ zsh หรือไม่
12 bash  shell  zsh  variable 

8
ฉันจะรับจำนวนตัวอักษรของคำในคอลัมน์ใดคอลัมน์หนึ่งได้อย่างไร
ฉันมีไฟล์ CSV เช่นนี้: abd,123,egypt,78 cde,456,england,45 ฉันจะรับจำนวนตัวอักษรของคำในคอลัมน์ที่ 3 ได้อย่างไร ฉันไม่สามารถหาวิธีwcทำสิ่งนี้ได้
12 shell  columns  csv  wc 

7
เป็นไปได้ไหมที่จะลบคำนำหน้าโฟลเดอร์ออกจากคำสั่ง `ls`
ฉันอยู่ในสคริปต์ทุบตีและฉันต้องการได้รับรายชื่อของไฟล์ทั้งหมด (สมมติว่าไฟล์ jar ทั้งหมด) ฉันรันคำสั่งls -1 lib/*.jarและได้รับผลลัพธ์: lib/mylib_1.jar lib/mylib_2.jar ... มีตัวเลือกใด ๆ ที่จะมีผลลัพธ์ต่อไปนี้: mylib_1.jar mylib_2.jar ... การทำcd libก่อนไม่ใช่ตัวเลือกเนื่องจากฉันอยู่ในลูปและจำเป็นต้องอยู่ในโฟลเดอร์พาเรนต์สำหรับการกระทำที่ฉันต้องการทำภายในลูป ฉันพยายามค้นหาข้อมูลด้วยการพิมพ์man lsแต่ไม่พบวิธีแก้ปัญหา วิธีแก้ปัญหาที่มีคำสั่งอื่นจะดีตราบใดที่ฉันสามารถส่งไปยังlsคำสั่งหรือพอเพียงได้
12 bash  shell  directory  ls 

3
เชลล์สคริปต์รอคำสั่งพื้นหลัง
ฉันกำลังเขียนสคริปต์ แต่มีบางสิ่งที่ฉันต้องการฉันไม่สามารถหาวิธีที่จะทำ ... ฉันต้องสร้างคำสั่งในพื้นหลัง "command1 &" จากนั้นบางส่วนในสคริปต์ฉันต้องรอให้เสร็จก่อนที่ฉันจะ command2 โดยทั่วไปฉันต้องการสิ่งนี้: หมายเหตุ: แต่ละคำสั่งจะทำงานในไดเรกทอรีเฉพาะ! ในตอนท้ายของ while ในขณะที่ command1 ของฉันสร้าง 4 ไดเร็กตอรี่, ซึ่งแต่ละอันรันโพรเซสเฉพาะ, ดังนั้นจำนวนโพรเซสที่กำลังทำงานอยู่คือ 4 a=1 while [$a -lt 4 ] . command1 #Generates 1 Process a= `export $a +1` done #Wait until the 4 process end and then run the command2 . command2 …

1
เหตุใด 'คำสั่ง nohup> & / dev / null' จึงดูเหมือน "ทำงาน" ในเชลล์บางตัว
ฉันแก้ไขคำตอบบน Ask Ubuntu ที่แนะนำต่อไปนี้ nohup gedit >& /dev/null & เมื่อพวกเขาตั้งใจจริง nohup gedit &> /dev/null & หลังได้อย่างถูกต้องเปลี่ยนเส้นทางทั้ง stderr และ stdout /dev/nullไป ฉันคาดหวังว่าอดีตจะสร้างไฟล์ชื่อ&หรือมีแนวโน้มที่จะให้ข้อผิดพลาดเช่นเดียวกับกรณีอื่น ๆ : $ echo "foo" >& bash: syntax error near unexpected token `newline' แต่ดูเหมือนว่ามันจะทำงานในลักษณะเดียวกับที่เคยเป็นมาก่อนgeditหน้าต่างปรากฏขึ้นและไม่มีการพิมพ์ข้อความแสดงข้อผิดพลาด ฉันควรทราบด้วยว่านี่เป็นเชลล์เฉพาะ: bash(4.2.45 (1) -release), zsh(5.0.2), csh(เวอร์ชั่นแพ็คเกจ deb: 20110502-2) และtcsh(6.18.01): ทำงานตามที่อธิบายไว้ข้างต้นไม่มีข้อความแสดงข้อผิดพลาดไม่มีไฟล์ที่สร้างขึ้น dash (0.5.7-3): $ nohup gedit …

4
วิธีการเปลี่ยนชื่อไฟล์ในขณะที่คัดลอก?
ฉันจะคัดลอก (สไตล์การเก็บถาวรที่ไม่มีการเปลี่ยนแปลงวันที่) ไฟล์ทั้งหมดในไดเรกทอรีสำรองไปยังไดเรกทอรีของผู้ใช้ในขณะที่เปลี่ยนชื่อแต่ละไฟล์เพื่อลบส่วนสตริงแบบสุ่มออกจากชื่อ (เช่น -2b0fd460_1426b77b1ee_-7b8e) ได้อย่างไร cp จาก: /backup/path/data/Erp.2014.02.16_16.57.03-2b0fd460_1426b77b1ee_-7b8e.etf ถึง: /home/user/data/Erp.2014.02.16_16.57.03.etf แต่ละไฟล์จะเริ่มต้นด้วย "Erp" ตามด้วยสตริงการประทับวันที่ตามเวลาด้วยสตริงแบบสุ่มและจากนั้นส่วนขยาย ".etf" ฉันต้องการเก็บองค์ประกอบของชื่อทั้งหมดรวมถึงการประทับวันที่ ฉันแค่ต้องการลบสตริงแบบสุ่ม สตริงสุ่มช่วยให้การสำรองข้อมูลหลายไฟล์เดียวกัน อย่างไรก็ตามในกรณีนี้ฉันเพิ่งรัน fdupes และไม่มีการซ้ำซ้อน ดังนั้นฉันสามารถกู้คืนไฟล์ทั้งหมดโดยลบสตริงแบบสุ่ม ฉันกำลังมองหาคำสั่ง bash หนึ่งบรรทัดเพื่อทำ หากไม่ได้ผลฉันสามารถทำได้สองขั้นตอนขึ้นไป ปกติฉันจะใช้ KRename แต่ในกรณีนี้ฉันต้องทุบตี (ฉันทำงานจากระยะไกล)
12 bash  shell  rename  file-copy 

3
สองหาคำสั่งเปรียบเทียบ
เมื่อเร็ว ๆ นี้ฉันได้รับfindหนึ่งซับ แต่ฉันไม่สามารถอธิบายได้ว่าความแตกต่างของสองด้านล่างมาจากไหน: ตัวอย่างที่ 1 [root@centos share]# find . -exec grep -i "madis" {} /dev/null \; ./names:Madison Randy:300:Product Development ตัวอย่างที่ 2 [root@centos share]# find . -exec grep -i "madis" {} \; Madison Randy:300:Product Development อย่างที่คุณเห็นในไฟล์แรกมีไฟล์เฉพาะที่สตริงนี้มาจากและจนถึงตอนนี้ฉันไม่สามารถรู้ได้ว่าทำไมมันถึงเกิดขึ้น
12 bash  shell  find 

4
เปลี่ยนชื่อไฟล์ในโฟลเดอร์ท้องถิ่นเพิ่มคำนำหน้าหรือคำต่อท้าย
ฉันมีไฟล์จำนวนมากในโฟลเดอร์และฉันต้องการเพิ่มคำนำหน้าหรือคำต่อท้าย (ไม่ใช่ทั้งคู่ ) ลงในพวกเขา ฉันตรวจสอบที่นี่และพบว่าฉันสามารถใช้ได้ for filename in *.jpg; do mv "$filename" "prefix_$filename"; done; เพื่อเพิ่มคำนำหน้าให้กับไฟล์ทั้งหมดที่ลงท้ายด้วย.jpg(และถ้าฉันลบออก.jpgมันจะเพิ่มคำนำหน้าให้กับไฟล์ทั้งหมดในโฟลเดอร์ปัจจุบัน) อย่างไรก็ตามฉันต้องการที่จะสามารถ เพิ่ม sufix (นั่นคือเปลี่ยนชื่อfilename.extเป็นfilename.whatever.ext) ตรวจสอบว่าคำนำหน้าหรือคำต่อท้ายมีอยู่แล้วและข้าม สร้างนามแฝงที่ยอมรับข้อโต้แย้งเช่นaddprefix whatever *.extหรือaddsufix whatever *.*

6
ทำไม“ $ ((~ 33))” ถึง -34
$ echo $(( 255 )) 255 $ echo $(( 33 )) 33 $ echo $(( ~33 )) -34 $ echo $(( ~255 )) -256 $ และเคอร์เนลของฉันคือ: $ uname -a Linux HOSTNAME 3.2.0-40-generic-pae #64-Ubuntu SMP Mon Mar 25 21:44:41 UTC 2013 i686 i686 i386 GNU/Linux คำถาม: ใช้ ~สำหรับลบหมายเลข AFAIK แต่ทำไมต้อง~33ผลิต-34และทำไมจะ~255ผลิต-256?
12 bash  shell  arithmetic 

2
ทำไมคำสั่ง 'cat' สองคำนี้จึงแตกต่างกัน?
สมมติว่า infile มีข้อความเฉพาะและฉันต้องดำเนินการชุดคำสั่งต่อไปนี้: exec 3<infile แมว -n <&3 แมว -n <&3 อินสแตนซ์แรกของ cat จะแสดงเนื้อหาของไฟล์ แต่ครั้งที่สองดูเหมือนจะไม่ทำอะไรเลย ทำไมพวกเขาถึงแตกต่างกัน

4
คัดลอกไฟล์เดียวไปยังหลายไดเรกทอรีโดยใช้ cp
คำถามนี้เป็นผลสืบเนื่องของทุกคำถามก่อนหน้านี้ฉันสร้างไดเรกทอรีต่าง ๆ mkdirนานาโดยใช้ ฉันกำลังใช้bashเปลือก ฉันสร้างไดเรกทอรีห้าสิบรายการโดยเริ่มต้นด้วยคำนำหน้า "s" โดยใช้คำสั่ง: mkdir $(printf "s%02i " $(seq 1 50)) ซึ่งใช้ตัวเลขเป็นศูนย์ที่สองพร้อมเลขศูนย์ นั่นคือไดเรกทอรีที่ผมได้รับเป็นของแบบฟอร์มs01, ,s02 ... ,s49s50 ตอนนี้ฉันต้องการใช้cpเพื่อคัดลอกไฟล์เดียว (ตัวอย่างtest.txt) ไปยังแต่ละไดเรกทอรีห้าสิบ เป็นไปได้ไหมที่จะทำสิ่งนี้ในลักษณะที่คล้ายคลึงกับที่กล่าวมา ตัวอย่างเช่นงานต่อไปนี้จะทำงานอย่างไร ฉันค่อนข้างใหม่กับ Unix / Linux ดังนั้นฉันจึงไม่ต้องการลองนี้จนกว่าจะมีคนโปรดให้ฉันบ่งบอกว่ามันปลอดภัย cp test.txt $ (printf "s% 02i.txt" $ (seq 1 50)) มองไปที่manหน้าcpนั้นดูเหมือนจะไม่cpรองรับหลายปลายทางเช่นนี้อย่างไรก็ตาม: NAME cp - copy files and directories SYNOPSIS cp [OPTION]... …
12 bash  shell  cp 


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