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

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

9
ฉันจะป้องกัน Conda ไม่ให้เปิดใช้งานสภาพแวดล้อมพื้นฐานโดยค่าเริ่มต้นได้อย่างไร
ฉันเพิ่งติดตั้ง anaconda2 บน Mac ของฉัน โดยค่าเริ่มต้น Conda ถูกกำหนดค่าให้เปิดใช้งานสภาพแวดล้อมพื้นฐานเมื่อฉันเปิดเซสชันเทอร์มินัลใหม่ ฉันต้องการเข้าถึงคำสั่ง Conda (เช่นฉันต้องการพา ธ ไปยัง Conda ที่เพิ่มใน $ PATH ของฉันซึ่ง Conda ทำเมื่อเริ่มต้นใช้งานได้ดี) แต่ฉันไม่ได้ตั้งโปรแกรมตามปกติในหลามและฉันไม่ต้องการให้ Conda เปิดใช้งานสภาพแวดล้อมตามค่าเริ่มต้น เมื่อดำเนินการครั้งแรกconda initจากพรอมต์ Conda จะเพิ่มสิ่งต่อไปนี้ในของฉัน.bash_profile: # >>> conda initialize >>> # !! Contents within this block are managed by 'conda init' !! __conda_setup="$('/Users/geoff/anaconda2/bin/conda' 'shell.bash' 'hook' 2> /dev/null)" if …
234 bash  anaconda  conda 

9
วิธีแสดงรายการเซสชันที่ใช้งานหน้าจอ
screenฉันมีพวงของเซิร์ฟเวอร์ซึ่งผมใช้ทดลองใช้ กระบวนการดังต่อไปนี้: ssh ไปยังเซิร์ฟเวอร์ XXX เปิด screen เริ่มการทดสอบในไม่กี่แท็บ detach screen ตัดการเชื่อมต่อจากเซิร์ฟเวอร์ ในขณะที่การทดสอบกำลังทำงานอยู่ฉันสามารถค้นหาได้อย่างง่ายดายว่าเซิร์ฟเวอร์ใดที่ใช้งานเซิร์ฟเวอร์sshทั้งหมดและแสดงรายการกระบวนการทำงานของฉัน (โดยใช้topหรือps) อย่างไรก็ตามเมื่อการทดสอบเสร็จสิ้นฉันจะค้นหาเซิร์ฟเวอร์ที่ฉันเปิดเซสชันหน้าจอได้อย่างไร (เพื่อให้ฉันสามารถดูผลลัพธ์ออกให้เปิดใหม่อีกครั้ง) PS: การทดลองของฉันพิมพ์ผลลัพธ์ไปยังไฟล์ด้วย ... แต่นี่ไม่ใช่ประเด็นของคำถามของฉัน

20
วิธีการวางไดเรกทอรี ~ / .composer / ผู้ขาย / bin ใน PATH ของคุณ
ฉันใช้ Ubuntu 14.04 และฉันได้ลองใช้วิธีที่เป็นไปได้ทั้งหมดในการติดตั้ง Laravel เพื่อประโยชน์ ข้อความแสดงข้อผิดพลาดทุกสิ่งที่ฉันลอง ตอนนี้ฉันกำลังลองวิธีแรกในเอกสาร quickstart นั่นคือผ่านตัวติดตั้ง Laravel แต่มันบอกว่า "ตรวจสอบให้แน่ใจว่าวาง~/.composer/vendor/binไดเรกทอรีไว้ในของคุณPATHเพื่อให้สามารถเรียกใช้ Laravel ได้เมื่อคุณเรียกใช้คำสั่ง Laravel ในเทอร์มินัลของคุณ" ดังนั้นคำถามของฉันคือฉันจะทำอย่างไร นี่อาจเป็นคำถามง่าย ๆ แต่ฉันผิดหวังจริง ๆ และขอขอบคุณสำหรับความช่วยเหลือ
232 bash  laravel  path 

5
วิธีการเขียนสตริงหลายบรรทัดโดยใช้ Bash กับตัวแปร?
ฉันจะเขียนหลายบรรทัดในไฟล์ที่เรียกว่าmyconfig.confใช้ BASH ได้อย่างไร #!/bin/bash kernel="2.6.39"; distro="xyz"; echo <<< EOL line 1, ${kernel} line 2, line 3, ${distro} line 4 line ... EOL >> /etc/myconfig.conf; cat /etc/myconfig.conf;
232 linux  bash  bash4 

14
วิธีที่ดีที่สุดในการจำลอง "กลุ่มโดย" จากทุบตี?
สมมติว่าคุณมีไฟล์ที่มีที่อยู่ IP หนึ่งที่อยู่ในแต่ละบรรทัด: 10.0.10.1 10.0.10.1 10.0.10.3 10.0.10.2 10.0.10.1 คุณต้องการเชลล์สคริปต์ที่นับจำนวนที่อยู่ IP แต่ละรายการที่ปรากฏในไฟล์ สำหรับอินพุตก่อนหน้านี้คุณต้องการเอาต์พุตต่อไปนี้: 10.0.10.1 3 10.0.10.2 1 10.0.10.3 1 วิธีหนึ่งในการทำเช่นนี้คือ: cat ip_addresses |uniq |while read ip do echo -n $ip" " grep -c $ip ip_addresses done อย่างไรก็ตามมันอยู่ไกลจากการมีประสิทธิภาพ คุณจะแก้ปัญหานี้อย่างมีประสิทธิภาพยิ่งขึ้นด้วยการใช้ bash ได้อย่างไร (สิ่งหนึ่งที่เพิ่มเติม: ฉันรู้ว่ามันสามารถแก้ไขได้จาก perl หรือ awk ฉันสนใจวิธีที่ดีกว่าในการทุบตีไม่ใช่ในภาษาเหล่านั้น) ข้อมูลเพิ่มเติม: สมมติว่าไฟล์ต้นฉบับคือ 5GB และเครื่องที่ใช้อัลกอริทึมมี 4GB …
231 bash  scripting 

27
การเปลี่ยนชื่อไฟล์ในโฟลเดอร์เป็นหมายเลขต่อเนื่อง
ฉันต้องการเปลี่ยนชื่อไฟล์ในไดเรกทอรีเป็นตัวเลขตามลำดับ อ้างอิงจากวันที่สร้างไฟล์ ตัวอย่างเช่นsadf.jpgการ0001.jpg, wrjr3.jpgการ0002.jpgและอื่น ๆ จำนวนเลขศูนย์นำไปขึ้นอยู่กับจำนวนของไฟล์ (ความจำเป็นในการ zeroes พิเศษถ้าไม่จำเป็นต้องไม่ได้)

4
วิธีสร้างไดเรกทอรีชั่วคราว
ฉันใช้ในการสร้างtempfileลบออกและสร้างเป็นไดเรกทอรี: tmpnam=`tempfile` rm -f $tmpnam mkdir "$tmpnam" ปัญหาคือกระบวนการอื่นอาจได้รับชื่อเดียวกันXถ้าตั้งใจเรียกใช้ไฟล์ชั่วคราวหลังจากหนึ่งกระบวนการrm -f Xและก่อนหน้าmkdir Xนี้

5
พิมพ์องค์ประกอบอาร์เรย์ในบรรทัดแยกต่างหากใน Bash?
ฉันจะพิมพ์องค์ประกอบอาเรย์ของ Bash Array ในแต่ละบรรทัดได้อย่างไร? อันนี้ใช้ได้ แต่มีวิธีที่ดีกว่า: $ my_array=(one two three) $ for i in ${my_array[@]}; do echo $i; done one two three พยายามตัวนี้ แต่มันไม่ทำงาน: $ IFS=$'\n' echo ${my_array[*]} one two three
229 arrays  bash 

3
รับ dirname / ชื่อไฟล์ล่าสุดในอาร์กิวเมนต์พา ธ ของไฟล์ใน Bash
ฉันกำลังพยายามเขียนเบ็ด post-commit สำหรับ SVN ซึ่งโฮสต์บนเซิร์ฟเวอร์การพัฒนาของเรา เป้าหมายของฉันคือพยายามตรวจสอบสำเนาของโปรเจ็กต์ที่กำหนดไปยังไดเร็กทอรีที่โฮสต์บนเซิร์ฟเวอร์โดยอัตโนมัติ อย่างไรก็ตามฉันต้องสามารถอ่านเฉพาะไดเรกทอรีสุดท้ายในสตริงไดเรกทอรีที่ส่งไปยังสคริปต์เพื่อชำระเงินไปยังไดเรกทอรีย่อยเดียวกันที่โฮสต์โครงการของเรา ตัวอย่างเช่นถ้าฉันทำ SVN ส่งมอบโครงการ "ตัวอย่าง" สคริปต์ของฉันจะได้รับ "/ usr / local / svn / repos / example" เป็นอาร์กิวเมนต์แรก ฉันต้องได้รับ "ตัวอย่าง" จากจุดสิ้นสุดของสตริงแล้วต่อกับสตริงอื่นเพื่อให้ฉันสามารถเช็คเอาต์ที่ "/ server / root / example" และดูการเปลี่ยนแปลงที่เกิดขึ้นทันที
228 linux  bash  shell  svn 

17
ใน Bash วิธีเพิ่ม“ คุณแน่ใจ [Y / n]” ในคำสั่งหรือนามแฝงใด ๆ
ในกรณีนี้โดยเฉพาะฉันต้องการเพิ่มการยืนยันใน Bash สำหรับ คุณแน่ใจไหม? [Y / N] สำหรับ Mercurial's hg push ssh://username@www.example.com//somepath/morepathซึ่งจริงๆแล้วเป็นนามแฝง มีคำสั่งมาตรฐานที่สามารถเพิ่มในนามแฝงเพื่อให้บรรลุหรือไม่ เหตุผลก็คือhg pushและhg outสามารถฟังเหมือนกันและบางครั้งเมื่อฉันต้องการhgoutrepoฉันอาจพิมพ์โดยไม่ตั้งใจhgpushrepo(ทั้งคู่เป็นนามแฝง) ปรับปรุง:ถ้ามันสามารถเป็นสิ่งที่ชอบในตัวคำสั่งที่มีคำสั่งอื่นเช่นconfirm && hg push ssh://...ที่ต้องการจะดี ... เพียงแค่คำสั่งที่สามารถขอได้yesหรือและดำเนินการกับส่วนที่เหลือถ้าnoyes
228 bash  alias  confirmation 

19
ฉันจะหา `find 'เพื่อละเว้นไดเรกทอรี. svn ได้อย่างไร
ฉันมักจะใช้findคำสั่งเพื่อค้นหาผ่านซอร์สโค้ดลบไฟล์อะไรก็ตาม น่ารำคาญเพราะการโค่นล้มเก็บข้อมูลที่ซ้ำกันของแต่ละไฟล์ใน.svn/text-base/ไดเรกทอรีการค้นหาที่เรียบง่ายของฉันจบลงด้วยการได้รับผลลัพธ์ซ้ำซ้อนมากมาย ตัวอย่างเช่นฉันต้องการค้นหาแบบซ้ำuintหลายครั้งmessages.hและหลายmessages.cppไฟล์: # find -name 'messages.*' -exec grep -Iw uint {} + ./messages.cpp: Log::verbose << "Discarding out of date message: id " << uint(olderMessage.id) ./messages.cpp: Log::verbose << "Added to send queue: " << *message << ": id " << uint(preparedMessage->id) ./messages.cpp: Log::error << "Received message with invalid SHA-1 hash: …
227 linux  find  bash  grep  svn 

8
ฉันจะเขียนสคริปต์ทุบตีเพื่อเริ่มต้นกระบวนการใหม่ได้อย่างไรถ้ามันตาย?
ฉันมีสคริปต์หลามที่จะตรวจสอบคิวและดำเนินการกับแต่ละรายการ: # checkqueue.py while True: check_queue() do_something() ฉันจะเขียนสคริปต์ทุบตีที่จะตรวจสอบว่ามันทำงานอยู่หรือไม่และเริ่มต้นได้อย่างไร รหัสหลอกต่อไปนี้คร่าวๆ (หรือบางทีมันควรจะทำอะไรเช่นps | grepนี้): # keepalivescript.sh if processidfile exists: if processid is running: exit, all ok run checkqueue.py write processid to processidfile ฉันจะเรียกสิ่งนั้นจาก crontab: # crontab */5 * * * * /path/to/keepalivescript.sh
226 bash  scripting  cron 

3
การเขียนสคริปต์ bash: หากอาร์กิวเมนต์มีค่าเท่ากับสตริงนี้ให้กำหนดตัวแปรเช่นเดียวกับสตริงนี้
ฉันกำลังทำสคริปต์ทุบตีและตอนนี้ฉันได้รับการเรียกตัวแปรsourceหนึ่งและหนึ่งอาร์เรย์เรียกว่าsamplesเช่นนี้: source='country' samples=(US Canada Mexico...) เนื่องจากฉันต้องการขยายจำนวนแหล่งข้อมูล (และแหล่งที่มาแต่ละแห่งมีตัวอย่างของตัวเอง) ฉันพยายามเพิ่มอาร์กิวเมนต์บางอย่างเพื่อทำสิ่งนี้ ฉันลองสิ่งนี้: source="" samples=("") if [ $1="country" ]; then source="country" samples="US Canada Mexico..." else echo "try again" fi แต่เมื่อฉันเรียกใช้สคริปต์ของฉันsource countries.sh countryมันไม่ทำงาน ผมทำอะไรผิดหรือเปล่า?

8
การปฏิบัติที่ดีที่สุดสำหรับการจัดการกับรหัสผ่านในที่เก็บคอมไพล์คืออะไร?
ฉันมีสคริปต์ Bash เล็กน้อยที่ฉันใช้เพื่อเข้าถึงตัวสั่นด้วยความตื่นเต้นและปรากฏการแจ้งเตือนคำรามในบางสถานการณ์ เป็นวิธีที่ดีที่สุดในการจัดการเก็บรหัสผ่านของฉันด้วยสคริปต์อะไร ฉันต้องการคอมมิชชันสคริปต์นี้ให้กับ repo git และทำให้สามารถใช้งานได้บน GitHub แต่ฉันสงสัยว่าวิธีที่ดีที่สุดในการทำให้การเข้าสู่ระบบ / รหัสผ่านของฉันเป็นส่วนตัวในขณะที่ทำเช่นนี้ ปัจจุบันรหัสผ่านจะถูกเก็บไว้ในสคริปต์ของตัวเอง ฉันไม่สามารถลบออกได้ก่อนที่จะส่งเนื่องจากการกระทำเดิมทั้งหมดจะมีรหัสผ่าน การพัฒนาโดยไม่มีรหัสผ่านไม่ใช่ตัวเลือก ฉันคิดว่าฉันควรจะเก็บรหัสผ่านไว้ในไฟล์ปรับแต่งภายนอก แต่ฉันคิดว่าฉันจะตรวจสอบเพื่อดูว่ามีวิธีที่กำหนดขึ้นเพื่อจัดการสิ่งนี้ก่อนที่ฉันจะลองและรวบรวมบางสิ่งเข้าด้วยกัน
225 git  bash  security  github  passwords 

13
เชลล์สคริปต์ - ลบอัญประกาศแรกและสุดท้าย (") ออกจากตัวแปร
ด้านล่างนี้เป็นตัวอย่างของเชลล์สคริปต์จากสคริปต์ที่ใหญ่กว่า มันลบคำพูดจากสตริงที่ถือโดยตัวแปร ฉันกำลังใช้ sed แต่มีประสิทธิภาพหรือไม่ ถ้าไม่เช่นนั้นวิธีที่มีประสิทธิภาพคืออะไร? #!/bin/sh opt="\"html\\test\\\"" temp=`echo $opt | sed 's/.\(.*\)/\1/' | sed 's/\(.*\)./\1/'` echo $temp
225 string  bash  shell  unix  sed 

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