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

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

4
วิธียืนยันว่าสตริงมีอักขระขึ้นบรรทัดใหม่และหากเป็นเช่นนั้นให้ลบออก
ฉันมีสตริงที่เป็นผลมาจากการดำเนินการบางอย่างที่ฉันไม่สามารถควบคุมได้ เมื่อฉันพิมพ์ตัวแปรนี้โดยใช้echoฉันได้รับ: echo $myvar hello อย่างไรก็ตามเมื่อฉันทำ if [ $myvar = "hello" ]; then echo they are equal else echo they are not equal fi ฉันได้เสมอว่าพวกเขาไม่เท่ากัน ฉันสงสัยว่านี่เป็นเพราะnewlineตัวละคร สตริงยังมีพฤติกรรมที่แปลกด้วย เมื่อฉันทำ: newVAR="this is my var twice: "$myvar$myvar echo $newVAR ฉันเข้าใจ: hellois my var twice: hello ฉันจะตรวจสอบได้อย่างไรว่านี่เป็นเรื่องจริงเนื่องจาก a newlineและถ้าใช่ให้ลบออก
9 bash  string 

3
บรรทัดใหม่ในตัวแปรทุบตี
ฉันพยายามเก็บหลายบรรทัดในตัวแปร bash แต่ดูเหมือนจะไม่ทำงาน ตัวอย่างเช่นถ้าฉันแสดง/binหนึ่งไฟล์ต่อบรรทัดและเก็บไว้ใน$LSนั้นฉันผ่าน$LSเป็น stdin ไปที่wcมันจะส่งกลับ 1 เสมอ: $ ls -1 /bin | wc -l 134 $ LS=$(ls -1 /bin); wc -l <<< $LS 1 ถ้าฉันพยายามที่จะส่งออกไปยังหน้าจอฉันได้รับผลลัพธ์ต่าง ๆ : echoพิมพ์บรรทัดทั้งหมดในบรรทัดเดียวในขณะที่printfพิมพ์เฉพาะบรรทัดแรก: #!/bin/bash LS=$(ls -1 /bin) echo $LS printf $LS ดังนั้นตัวแปร bash สามารถมีได้หลายบรรทัด?
9 bash  shell  quoting 

2
ในการวนซ้ำอาร์เรย์ให้เพิ่มองค์ประกอบลงในอาร์เรย์
ฉันมีปัญหากับการวนซ้ำในทุบตี ตัวอย่าง: ("etc" "bin" "var")ฉันมีอาร์เรย์ และฉันทำซ้ำในอาร์เรย์นี้ แต่ในลูปฉันต้องการผนวกค่าลงในอาร์เรย์ เช่น array=("etc" "bin" "var") for i in "${array[@]}" do echo $i done นี้จะแสดงetc bin var(แน่นอนในบรรทัดที่แยกต่างหาก) และถ้าฉันผนวกหลังจากdoนั้น: array=("etc" "bin" "var") for i in "${array[@]}" do array+=("sbin") echo $i done ฉันต้องการ: etc bin var sbin(แน่นอนในบรรทัดที่แยกต่างหาก) สิ่งนี้ไม่ทำงาน ฉันจะทำมันได้อย่างไร
9 bash  array  for 

3
ฉีดบรรทัดเพื่อทุบตีประวัติ
โดยค่าเริ่มต้นทุบตีสายจาก~/.bash_historyประวัติศาสตร์ เป็นไปได้ไหมที่จะเพิ่มไฟล์ที่กำหนดเองเพื่อโหลดด้วย ฉันต้องการฉีดไฟล์ที่มีคำสั่งที่ฉันใช้เป็นประจำและเข้าถึงมันผ่านการค้นหาในตัว
9 bash 

4
ย้ายไฟล์ตามวันที่ไปยังไดเรกทอรีอื่นโดยใช้ CLI
ฉันมีรูปภาพจำนวนมากจากฮาร์ดไดรฟ์เก่าที่ฉันพยายามจัดระเบียบ ถ้าฉันรันls -lฉันสังเกตว่าไฟล์เหล่านี้ทั้งหมดมีวันที่สร้างปี 2555 หรือก่อนหน้า โดยอุดมคติแล้วฉันต้องการย้ายสิ่งเหล่านี้ไปยังฮาร์ดไดรฟ์ที่สองของคอมพิวเตอร์ซึ่งไม่ได้ตั้งค่าให้ติดตั้งโดยอัตโนมัติ โดยเฉพาะอย่างยิ่งฉันสามารถทำสิ่งนี้ทั้งหมดเป็นชุดที่มีคำสั่งเชื่อมโยงกัน จนถึงตอนนี้ผมมีls -l | grep -i 2012ที่ถ่มน้ำลายออกเฉพาะไฟล์ที่มี 2012 ls -lในวันที่จัดไว้ให้โดย ทีนี้เคล็ดลับก็คือcp'ทุกไฟล์เหล่านั้นไปยังไดเรกทอรีใหม่ ฉันไม่แน่ใจว่าจะไปที่ไหนเพราะจะต้องคัดลอกแต่ละไฟล์ คำสั่งชุดถัดไปของฉันคืออะไร

1
ทำไมไม่มีบรรทัดใหม่ในตอนท้ายของการอ้างถึง subshell และส่งผ่านผลลัพธ์เพื่อ echo
เมื่อฉันทำls | grep pngผลลัพธ์ของ grep คือ: 2015-05-15-200203_1920x1080_scrot.png 2015-05-16-025536_1920x1080_scrot.png (ชื่อไฟล์ขึ้นบรรทัดใหม่ชื่อไฟล์ขึ้นบรรทัดใหม่) ดังนั้นecho $(ls | grep png)ผลลัพธ์: 2015-05-15-200203_1920x1080_scrot.png 2015-05-16-025536_1920x1080_scrot.png (ชื่อไฟล์, ช่องว่างจากการแยกคำ, ชื่อไฟล์, บรรทัดใหม่ !! จาก echo !!) นั่นคือทั้งหมดที่ตกลง แต่เมื่อฉันทำเช่นนี้เพื่อป้องกันการแยกคำ: echo "$(ls | grep png)"ออกเป็น: 2015-05-15-200203_1920x1080_scrot.png 2015-05-16-025536_1920x1080_scrot.png และคำถามของฉันคือขึ้นบรรทัดใหม่ที่สอง (หนึ่งควรมาจาก grep และหนึ่งจาก echo)


1
Linux: คำสั่ง set สำหรับตัวแปรโลคัล
ฉันพยายามทำความเข้าใจกับตัวแปรโลคัล / สภาพแวดล้อมและคำสั่งส่งออก / ตั้งค่า $ set FILEM="razrax" $ echo $FILEM $ FILEN="test" $ echo $FILEN test โปรดอธิบายว่าทำไมecho $FILEMส่งคืนสตริงว่าง
9 bash  shell  variable 

2
วิธีทุบตีปฏิบัติต่อ“>> ()”
ขณะทำการทดลองกับการเปลี่ยนเส้นทางเอาต์พุตและการทดแทนกระบวนการฉันพบคำสั่งต่อไปนี้และผลลัพธ์ที่ได้: me @ elem: ~ $ echo foo>> (cat); แถบสะท้อนเสียง บาร์ me @ elem: ~ $ foo (ใช่แล้วบรรทัดใหม่ที่ว่างที่สุดจะเป็นเจตนา) ดังนั้นทุบบาร์ของ echo พิมพ์พรอมต์ตามปกติของฉัน, foo ของ echo, ขึ้นบรรทัดใหม่, และปล่อยเคอร์เซอร์ของฉันไว้ที่นั่น หากฉันกด Enter อีกครั้งจะพิมพ์พรอมต์ของฉันในบรรทัดใหม่และปล่อยเคอร์เซอร์ไว้ตาม (ตามที่คาดไว้เมื่อมีคนกด Enter บนบรรทัดคำสั่งว่าง) ฉันคาดหวังว่ามันจะเขียน foo ให้กับ file descriptor cat อ่านมันและ echo's foo แถบ echo echo ที่สองจากนั้นกลับไปที่ command prompt แต่นั่นไม่ใช่กรณีที่ชัดเจน ใครช่วยอธิบายหน่อยได้ว่าเกิดอะไรขึ้น?

3
เหตุใดคำสั่งนี้จึงไม่ทำงาน:“ ps aux | grep xscreensaver”
ฉันไม่เห็นเพลงฮิตใด ๆ เกี่ยวกับสิ่งนี้ใน google ดังนั้นฉันจึงขอให้คุณ: ฉันพยายามเรียกใช้คำสั่งนี้ในเซสชัน ssh, Local คือ Debian Wheezy KDE, remote คือ Fedora 21 Gnome: ps aux | grep xscreensaver และนี่คือผลลัพธ์: bash: grep: command not found... ฉันไม่เคยเห็นสิ่งนี้มาก่อนสาเหตุคืออะไร ฉันเพิ่งจะอัปเดตระบบไม่กี่ชั่วโมงก่อนหน้านี้ แต่ไม่เห็นแพ็คเกจที่ทำเครื่องหมายไว้เพื่อนำออก มีผู้ใช้สองคนในระบบและฉันเท่านั้นที่ติดตั้งหรือลบซอฟต์แวร์ในนั้น แก้ไข # 1 นี่คือคำสั่งและผลลัพธ์ที่คัดลอกสังเกตว่าช่องว่างไม่มีในครั้งที่สอง: [root@Hostname ~]# ps aux | grep xscreensaver bash: : command not found... [root@Hostname ~]# …

2
เรียกใช้คำสั่งอื่นก่อนเรียกใช้คำสั่งที่ผู้ใช้ต้องการเรียกใช้
สมมติว่าฉันต้องการแก้ไขพฤติกรรมดั้งเดิมของlsเครื่องมือด้วยวิธีนี้: $ ls Hello World file1 file2 ... ฉันจะทำสิ่งนี้ได้อย่างไร เมื่อเรียกใช้ผมอยากจะเรียกใช้คำสั่งอื่นพูดให้ของlsecho "Hello World!" วิธีแก้ปัญหาอย่างรวดเร็วที่ฉันเห็นใช้นามแฝง: alias orig_ls="ls" alias ls='echo "Hello World!"' แต่นี้ไม่ได้เป็นทางออกที่แท้จริงตั้งแต่เมื่อฉันจะทำงานมันจะเอาท์พุทorig_ls"Hello World!"

1
bashscript เพื่อตรวจจับปุ่มลูกศรขวาถูกกด
ทำไมสิ่งนี้ถึงตรวจพบว่าเป็นจริงเสมอแม้ว่ารหัสคีย์นั้นจะไม่ถูกต้องลูกศรขวา stty_state=`stty -g` stty raw; stty -echo keycode=`dd bs=1 count=1 2>/dev/null` stty "$stty_state" echo $keycode if [ "$keycode"=39 ]; then echo "Right Arrow Key Pressed!" fi

2
หากกระบวนการลูกที่เกิดใหม่ล้มเหลวให้ฆ่าทั้งหมดและออก
ในสคริปต์ของฉันฉันแบ่งชุดข้อมูลเป็น input_aa, input_ab และอื่น ๆ จากนั้นฉันเรียกใช้แต่ละสคริปต์ Python เดียวกันเช่น: # Execute program on each split file for part in input_*; do python3 $part & done wait คำถามของฉันคือสองเท่า: ฉันจะตรวจสอบได้อย่างไรว่ากระบวนการ Python ล้มเหลวและเมื่อตรวจพบฉันจะฆ่าเด็กที่เกิดมาแล้วทั้งหมดและออกจากสคริปต์ได้อย่างไร
9 bash  shell  python 

3
ส่งต่อฟังก์ชันและตัวแปรไปยัง sudo su - <user> << EOF
ฉันได้ประกาศฟังก์ชั่นและตัวแปรใน bash / ksh และฉันต้องการส่งต่อไปยังsudo su - {user} &lt;&lt; EOF: #!/bin/bash log_f() { echo "LOG line: $@" } extVAR="yourName" sudo su - &lt;user&gt; &lt;&lt; EOF intVAR=$(date) log_f ${intVAR} ${extVAR} EOF

2
ฉันจะผ่านการ subshell ผ่าน 'time' แบบมีเงื่อนไขได้อย่างไร
timeฉันมีสคริปต์การติดตั้งสำหรับกล่องจรจัดที่ผมใช้ในการวัดขั้นตอนเดียวกับ ตอนนี้ฉันต้องการเปิดหรือปิดใช้งานการวัดเวลาแบบมีเงื่อนไข ตัวอย่างเช่นก่อนหน้านี้บรรทัดจะมีลักษณะดังนี้: time (apt-get update &gt; /tmp/last.log 2&gt;&amp;1) ตอนนี้ฉันคิดว่าฉันสามารถทำสิ่งนี้ได้ง่ายๆ: MEASURE_TIME=true [[ $MEASURE_TIME = true ]] &amp;&amp; TIME="time --format=%e" || TIME="" $TIME (apt-get update &gt; /tmp/last.log 2&gt;&amp;1) แต่สิ่งนี้จะไม่ทำงาน: syntax error near unexpected token `apt-get' `$TIME (apt-get update &gt; /tmp/last.log 2&gt;&amp;1)' มีปัญหาอะไรที่นี่
9 bash  shell  quoting  time 

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