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

สำหรับคำถามเกี่ยวกับสคริปต์ที่เขียนขึ้นสำหรับเชลล์คำสั่ง Bash สำหรับเชลล์สคริปต์ที่มีข้อผิดพลาด / ข้อผิดพลาดทางไวยากรณ์โปรดตรวจสอบด้วยโปรแกรม shellcheck (หรือในเซิร์ฟเวอร์ shellcheck เว็บที่ https://shellcheck.net) ก่อนโพสต์ที่นี่ คำถามเกี่ยวกับการใช้งานอินเทอร์แอคทีฟของ Bash นั้นมีแนวโน้มที่จะอยู่ในหัวข้อของผู้ใช้ขั้นสูงมากกว่าในสแต็คโอเวอร์โฟลว์

3
Bash Script: นับบรรทัดที่ไม่ซ้ำกันในไฟล์
สถานการณ์: ฉันมีไฟล์ขนาดใหญ่ (หลายล้านบรรทัด) ที่มีที่อยู่ IP และพอร์ตจากการดักจับเครือข่ายหลายชั่วโมงหนึ่งพอร์ต / พอร์ตต่อบรรทัด เส้นเป็นรูปแบบนี้: ip.ad.dre.ss[:port] ผลลัพธ์ที่ต้องการ: มีรายการสำหรับแต่ละแพ็กเก็ตที่ฉันได้รับขณะบันทึกดังนั้นจึงมีที่อยู่ที่ซ้ำกันจำนวนมาก ฉันต้องการเรียกใช้สิ่งนี้ผ่านเชลล์สคริปต์บางประเภทซึ่งจะสามารถลดเป็นบรรทัดของรูปแบบได้ ip.ad.dre.ss[:port] count ซึ่งcountคือจำนวนของการเกิดขึ้นของที่อยู่เฉพาะที่ (และพอร์ต) ไม่ต้องทำงานพิเศษให้ถือว่าพอร์ตต่าง ๆ เป็นที่อยู่ที่แตกต่างกัน จนถึงตอนนี้ฉันใช้คำสั่งนี้เพื่อขูดที่อยู่ IP ทั้งหมดจากไฟล์บันทึก: grep -o -E [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+(:[0-9]+)? ip_traffic-1.log > ips.txt จากนั้นฉันสามารถใช้ regex ที่ค่อนข้างง่ายเพื่อขูดที่อยู่ IP ทั้งหมดที่ส่งมาจากที่อยู่ของฉัน (ซึ่งฉันไม่สนใจ) จากนั้นฉันสามารถใช้สิ่งต่อไปนี้เพื่อแยกรายการที่ไม่ซ้ำกัน: sort -u ips.txt > intermediate.txt ฉันไม่รู้ว่าฉันจะรวมการนับบรรทัดด้วยการเรียงลำดับอย่างไร
129 bash 

17
ลบสาขาระยะไกลหลายแห่งในคอมไพล์
ฉันมีสมาชิกในทีมที่ผลักดันสาขาในท้องถิ่นของเขากว่า 150 สาขาไปยัง repo ส่วนกลางของเราโดยไม่ได้ตั้งใจ โชคดีที่พวกเขาทั้งหมดมีคำนำหน้าเหมือนกัน การใช้คำนำหน้านั้นมีคำสั่ง git หรือเชลล์สคริปต์เล็ก ๆ น้อย ๆ ที่ฉันสามารถใช้ซึ่งจะลบทั้งหมดในครั้งเดียวหรือไม่
129 git  bash 

11
แปลงการประทับเวลา Unix เป็นสตริงวันที่
มีวิธีง่ายๆในการแปลงการประทับเวลา Unix เป็นวันที่จากบรรทัดคำสั่ง Unix หรือไม่? dateอาจใช้งานได้ยกเว้นว่าจะค่อนข้างอึดอัดในการระบุแต่ละองค์ประกอบ (เดือนวันปีชั่วโมง ฯลฯ ) และฉันไม่สามารถหาวิธีทำให้มันทำงานได้อย่างถูกต้อง ดูเหมือนว่าอาจมีวิธีที่ง่ายกว่านี้ - ฉันขาดอะไรไปหรือเปล่า?

13
เว็บเซิร์ฟเวอร์น้อยที่สุดโดยใช้ netcat
ฉันกำลังพยายามตั้งค่าเว็บเซิร์ฟเวอร์ขั้นต่ำโดยใช้ netcat (nc) ตัวอย่างเช่นเมื่อเบราว์เซอร์เรียกใช้ localhost: 1500 ควรแสดงผลลัพธ์ของฟังก์ชัน ( วันที่ในตัวอย่างด้านล่าง แต่สุดท้ายจะเป็นโปรแกรม python หรือ c ที่ให้ข้อมูลบางส่วน) เว็บเซิร์ฟเวอร์ netcat ตัวน้อยของฉันจะต้องวนซ้ำใน bash จริงสักครู่อาจจะง่ายเพียงแค่นี้: while true ; do echo -e "HTTP/1.1 200 OK\n\n $(date)" | nc -l -p 1500 ; done เมื่อฉันลองสิ่งนี้เบราว์เซอร์จะแสดงข้อมูลที่มีอยู่ในปัจจุบันในช่วงเวลาที่ nc เริ่มทำงาน ฉันต้องการให้เบราว์เซอร์แสดงข้อมูลในช่วงเวลาที่เบราว์เซอร์ร้องขอ ฉันจะบรรลุเป้าหมายนี้ได้อย่างไร?
129 bash  webserver  netcat 

8
เปลี่ยนเส้นทาง STDERR / STDOUT ของกระบวนการหลังจากเริ่มต้นแล้วโดยใช้บรรทัดคำสั่ง?
ในเชลล์คุณสามารถเปลี่ยนเส้นทางได้> <ฯลฯ แต่หลังจากเริ่มโปรแกรมแล้วจะเป็นอย่างไร? นี่คือวิธีที่ฉันถามคำถามนี้โปรแกรมที่ทำงานอยู่เบื้องหลังเทอร์มินัลของฉันจะส่งข้อความที่น่ารำคาญออกมา เป็นกระบวนการที่สำคัญดังนั้นฉันจึงต้องเปิดเชลล์อื่นเพื่อหลีกเลี่ยงข้อความ ฉันต้องการที่จะสามารถ>/dev/nullหรือเปลี่ยนเส้นทางอื่น ๆ เพื่อที่ฉันจะได้ทำงานในเชลล์เดียวกันต่อไป
127 linux  bash  shell 

9
รับตัวแปรสภาพแวดล้อมจาก Docker Container
วิธีที่ง่ายที่สุดในการรับตัวแปรสภาพแวดล้อมจากคอนเทนเนอร์นักเทียบท่าที่ยังไม่ได้ประกาศใน Dockerfileคืออะไร ตัวอย่างเช่นตัวแปรสภาพแวดล้อมที่ถูกตั้งค่าผ่านบางdocker exec container /bin/bashเซสชัน? ฉันทำได้docker exec container env | grep ENV_VARแต่ฉันต้องการสิ่งที่คืนค่ามากกว่า ฉันได้ลองใช้docker exec container echo "$ENV_VAR"แล้ว แต่การแทนที่ดูเหมือนจะเกิดขึ้นนอกคอนเทนเนอร์ดังนั้นฉันจึงไม่ได้รับ env var จากคอนเทนเนอร์ แต่เป็นการแทนที่ env var จากคอมพิวเตอร์ของฉันเอง ขอบคุณ

9
ฉันจะใช้ su เพื่อเรียกใช้สคริปต์ bash ที่เหลือในฐานะผู้ใช้นั้นได้อย่างไร
ฉันได้เขียนสคริปต์ที่ใช้เป็นอาร์กิวเมนต์ซึ่งเป็นสตริงที่เชื่อมต่อกันของชื่อผู้ใช้และโครงการ สคริปต์ควรจะเปลี่ยน (su) เป็นชื่อผู้ใช้ cd ไปยังไดเร็กทอรีเฉพาะตามสตริงโครงการ โดยพื้นฐานแล้วฉันต้องการทำ: su $USERNAME; cd /home/$USERNAME/$PROJECT; svn update; ปัญหาคือเมื่อฉันทำซู ... มันก็รออยู่ที่นั่น ซึ่งสมเหตุสมผลตั้งแต่ขั้นตอนการดำเนินการผ่านไปจนถึงการเปลี่ยนไปใช้ผู้ใช้ เมื่อฉันออกจากนั้นสิ่งที่เหลือจะดำเนินการ แต่ไม่ได้ผลตามที่ต้องการ ฉันนำหน้า su ไปยังคำสั่ง svn แต่คำสั่งล้มเหลว (กล่าวคือไม่ได้อัพเดต svn ในไดเร็กทอรีที่ต้องการ) ฉันจะเขียนสคริปต์ที่อนุญาตให้ผู้ใช้สลับผู้ใช้และเรียกใช้ svn (เหนือสิ่งอื่นใด) ได้อย่างไร

3
จะตั้งค่าตัวแปรสภาพแวดล้อมเฉพาะช่วงเวลาของสคริปต์ได้อย่างไร?
บน Linux (Ubuntu 11.04) ใน bash เป็นไปได้ไหมที่จะตั้งค่าตัวแปรสภาพแวดล้อมชั่วคราวที่จะแตกต่างจากตัวแปรปกติในช่วงระยะเวลาของสคริปต์? ตัวอย่างเช่นในเชลล์สคริปต์การสร้างแอปที่บันทึกไปยัง HOME แบบพกพาโดยการตั้งค่า HOME เป็นโฟลเดอร์ชั่วคราวในไดเร็กทอรีการทำงานปัจจุบันจากนั้นเปิดแอป


8
วิธีรับอักขระสุดท้ายของสตริงในเชลล์
ฉันได้เขียนบรรทัดต่อไปนี้เพื่อรับอักขระสุดท้ายของสตริง: str=$1 i=$((${#str}-1)) echo ${str:$i:1} ใช้ได้กับabcd/: $ bash last_ch.sh abcd/ / มันไม่ทำงานสำหรับabcd* : $ bash last_ch.sh abcd* array.sh assign.sh date.sh dict.sh full_path.sh last_ch.sh มันจะแสดงรายการไฟล์ในโฟลเดอร์ปัจจุบัน
127 string  bash  shell 

11
Unix - สร้างเส้นทางของโฟลเดอร์และไฟล์
ฉันรู้ว่าคุณสามารถmkdirสร้างไดเร็กทอรีและtouchสร้างไฟล์ได้ แต่ไม่มีวิธีใดที่จะดำเนินการทั้งสองอย่างในคราวเดียวได้? เช่นถ้าฉันต้องการทำด้านล่างเมื่อotherไม่มีโฟลเดอร์: cp /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt ข้อผิดพลาด: cp: cannot create regular file `/my/other/path/here/cpedthing.txt': No such file or directory มีใครคิดฟังก์ชันเป็นวิธีแก้ปัญหานี้หรือไม่?
126 linux  bash  shell  unix  scripting 

9
การลบบรรทัดจากไฟล์หนึ่งซึ่งอยู่ในไฟล์อื่น
ฉันมีไฟล์f1: line1 line2 line3 line4 .. .. ฉันต้องการลบบรรทัดทั้งหมดที่อยู่ในไฟล์อื่นf2: line2 line8 .. .. ฉันได้ลองทำอะไรบางอย่างcatและsedไม่ได้ใกล้เคียงกับที่ฉันตั้งใจ ฉันจะทำเช่นนี้ได้อย่างไร?
126 bash  scripting  sh 

6
เลขฐานสิบหกถึงทศนิยมในเชลล์สคริปต์
มีใครช่วยฉันแปลงเลขฐานสิบหกเป็นเลขฐานสิบในเชลล์สคริปต์ได้ไหม เช่นฉันต้องการแปลงเลขฐานสิบหกเป็นฐานสิบbfca3000โดยใช้เชลล์สคริปต์ โดยพื้นฐานแล้วฉันต้องการความแตกต่างของเลขฐานสิบหกสองตัว รหัสของฉันคือ: var3=`echo "ibase=16; $var1" | bc` var4=`echo "ibase=16; $var2" | bc` var5=$(($var4-$var3)) # [Line 48] เมื่อดำเนินการฉันได้รับข้อผิดพลาดนี้: Line 48: -: syntax error: operand expected (error token is "-")
126 bash  shell  hex  decimal 

11
ฉันจะตัดอักขระ X ตัวแรกออกจากสตริงโดยใช้ sed ได้อย่างไร
ฉันกำลังเขียนเชลล์สคริปต์สำหรับลินุกซ์แบบฝังในกล่องอุตสาหกรรมขนาดเล็ก ฉันมีตัวแปรที่มีข้อความpid: 1234และฉันต้องการตัดอักขระ X ตัวแรกออกจากบรรทัดดังนั้นจะมีเพียง 1234 ตัวเท่านั้น ฉันมีตัวแปรเพิ่มเติมที่ต้อง "ล้าง" ดังนั้นฉันจึงต้องตัด X อักขระแรกออกไปและใช้${string:5}ไม่ได้ด้วยเหตุผลบางประการในระบบของฉัน sedสิ่งเดียวที่กล่องดูเหมือนว่าจะมีคือ ฉันพยายามทำให้สิ่งต่อไปนี้ใช้งานได้: result=$(echo "$pid" | sed 's/^.\{4\}//g') ความคิดใด ๆ ?
126 bash  shell  sed 


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