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

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

3
วิธีใช้> ในคำสั่ง xargs
ฉันต้องการค้นหาคำสั่ง bash ที่จะให้ฉัน grep ทุกไฟล์ในไดเรกทอรีและเขียนผลลัพธ์ของ grep นั้นไปยังไฟล์แยกต่างหาก ฉันเดาว่าจะต้องทำอะไรแบบนี้ ls -1 | xargs -I{} "grep ABC '{}' > '{}'.out" แต่เท่าที่ฉันรู้ xargs ไม่ชอบอัญประกาศ อย่างไรก็ตามหากฉันลบเครื่องหมายคำพูดคู่ออกคำสั่งจะเปลี่ยนทิศทางเอาต์พุตของคำสั่งทั้งหมดไปยังไฟล์เดียวที่เรียกว่า '{}' ออกแทนที่จะเป็นชุดไฟล์แต่ละไฟล์ ไม่มีใครรู้วิธีการทำเช่นนี้โดยใช้ xargs? ฉันเพิ่งใช้สถานการณ์ grep นี้เป็นตัวอย่างเพื่อแสดงปัญหาของฉันกับ xargs ดังนั้นการแก้ปัญหาใด ๆ ที่ไม่ได้ใช้ xargs นั้นไม่เหมาะสมสำหรับฉัน
160 bash  redirect  xargs 

11
RVM ไม่ใช่ฟังก์ชั่นการเลือกทับทิมด้วย 'rvm use …' จะไม่ทำงาน
รายการรุ่นทับทิม console:~$ rvm list rvm rubies ruby-2.0.0-p481 [ i686 ] # => - current # =* - current && default # * - default ลองใช้ทับทิมเฉพาะรุ่น console:~$ rvm use 2.0.0 RVM is not a function, selecting rubies with 'rvm use ...' will not work. You need to change your terminal emulator …
160 ruby  bash  rvm 

6
เหตุใด $$ จึงส่งคืนรหัสเดียวกันกับกระบวนการหลัก
ฉันมีปัญหากับ Bash และฉันไม่รู้ว่าทำไม ภายใต้เปลือกฉันป้อน: echo $$ ## print 2433 (echo $$) ## also print 2433 (./getpid) ## print 2602 "getpid" เป็นโปรแกรม C เพื่อรับ pid ปัจจุบันเช่น: int main() { printf("%d", (int)getpid()); return 0; } สิ่งที่ทำให้ฉันสับสนคือ: ฉันคิดว่า "(คำสั่ง)" เป็นกระบวนการย่อย (ฉันใช่มั้ย) และฉันคิดว่า pid ของมันควรจะแตกต่างจาก pid ของผู้ปกครอง แต่พวกเขาเหมือนกันทำไม ... เมื่อฉันใช้โปรแกรมของฉันเพื่อแสดง pid ระหว่างวงเล็บ, pid ที่มันแสดงนั้นแตกต่างกันใช่ไหม? …
160 bash  shell  pid  subshell 

4
Bash script - เนื้อหาตัวแปรเป็นคำสั่งให้เรียกใช้
ฉันมีสคริปต์ Perl ที่ให้หมายเลขสุ่มรายการที่กำหนดไว้ซึ่งสอดคล้องกับบรรทัดของไฟล์ sedถัดไปผมต้องการที่จะดึงสายที่มาจากไฟล์โดยใช้ #!/bin/bash count=$(cat last_queries.txt | wc -l) var=$(perl test.pl test2 $count) ตัวแปรผลตอบแทนการส่งออกเช่น:var cat last_queries.txt | sed -n '12p;500p;700p'ปัญหาคือฉันไม่สามารถเรียกใช้คำสั่งสุดท้ายนี้ได้ ฉันพยายามด้วย$varแต่เอาต์พุตไม่ถูกต้อง (ถ้าฉันรันด้วยตนเองคำสั่งก็ใช้ได้ดีดังนั้นจึงไม่มีปัญหา) วิธีที่ถูกต้องในการทำเช่นนี้คืออะไร? PS: แน่นอนว่าฉันสามารถทำงานทั้งหมดใน Perl ได้ แต่ฉันพยายามเรียนรู้ด้วยวิธีนี้เพราะมันสามารถช่วยฉันในสถานการณ์อื่นได้
159 bash 

12
วิธีการดีบักสคริปต์ทุบตี? [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน2 ปีที่ผ่านมา ปรับปรุงคำถามนี้ มีวิธีการดีบักสคริปต์ทุบตีหรือไม่? เช่นบางอย่างที่พิมพ์บันทึกการดำเนินการเช่น "การโทรสาย 1", "การโทร 2 บรรทัด" เป็นต้น
159 bash  shell 

3
ได้รับข้อผิดพลาด 'แหล่งที่มา: ไม่พบ' เมื่อใช้แหล่งข้อมูลในสคริปต์ทุบตี
ฉันพยายามเขียน (สิ่งที่ฉันคิดว่าเป็น) สคริปต์ทุบตีง่ายๆที่จะ: ใช้ virtualenv เพื่อสร้างสภาพแวดล้อมใหม่ที่ $ 1 เปิดใช้งานสภาพแวดล้อมเสมือนจริง ทำบางสิ่งเพิ่มเติม (ติดตั้ง django เพิ่ม django-admin.py ไปยังเส้นทางของ virtualenv ฯลฯ ) ขั้นตอนที่ 1 ทำงานได้ค่อนข้างดี แต่ฉันไม่สามารถเปิดใช้งาน virtualenv ได้ สำหรับผู้ที่ไม่คุ้นเคยกับ virtualenv มันจะสร้างactivateไฟล์ที่เปิดใช้งานสภาพแวดล้อมเสมือน จาก CLI คุณเรียกใช้โดยใช้source source $env_name/bin/activate โดยที่ $ env_name เห็นได้ชัดว่าเป็นชื่อของ dir ที่ติดตั้ง env เสมือน ในสคริปต์ของฉันหลังจากสร้างสภาพแวดล้อมเสมือนฉันเก็บเส้นทางไปยังสคริปต์เปิดใช้งานเช่นนี้: activate="`pwd`/$ENV_NAME/bin/activate" แต่เมื่อฉันโทรsource "$activate"ฉันจะได้รับสิ่งนี้: /home/clawlor/bin/scripts/djangoenv: 20: source: not found ฉันรู้ว่ามีเส้นทางที่ถูกต้องไปยังสคริปต์เปิดใช้งานในความเป็นจริงผมยังทดสอบที่ไฟล์จะมีก่อนที่ผมจะโทร$activate …
159 bash  virtualenv 

21
วิธีการดึงข้อมูลพา ธ สัมบูรณ์ที่สัมพันธ์กัน
มีคำสั่งให้ดึงเส้นทางสัมบูรณ์ที่กำหนดเส้นทางสัมพัทธ์หรือไม่? ตัวอย่างเช่นฉันต้องการ $ line มีเส้นทางที่แน่นอนของแต่ละไฟล์ใน dir ./etc/ find ./ -type f | while read line; do echo $line done
159 bash  shell  path  absolute 

13
ชื่อตัวแปรแบบไดนามิกใน Bash
ฉันสับสนเกี่ยวกับสคริปต์ทุบตี ฉันมีรหัสต่อไปนี้: function grep_search() { magic_way_to_define_magic_variable_$1=`ls | tail -1` echo $magic_variable_$1 } lsฉันต้องการที่จะสามารถที่จะสร้างชื่อตัวแปรที่มีอาร์กิวเมนต์แรกของคำสั่งและแบริ่งมูลค่าของเช่นบรรทัดสุดท้ายของ ดังนั้นเพื่อแสดงสิ่งที่ฉันต้องการ: $ ls | tail -1 stack-overflow.txt $ grep_search() open_box stack-overflow.txt ดังนั้นฉันจะกำหนด / ประกาศ$magic_way_to_define_magic_variable_$1อย่างไรและฉันควรจะเรียกมันอย่างไรภายในสคริปต์? ฉันได้พยายามeval, ${...}, \$${...}แต่ฉันยังคงสับสน

10
วิธีรับรายการไฟล์ในไดเรกทอรีในเชลล์สคริปต์
ฉันพยายามรับเนื้อหาของไดเรกทอรีโดยใช้เชลล์สคริปต์ สคริปต์ของฉันคือ: for entry in `ls $search_dir`; do echo $entry done โดยที่$search_dirเป็นเส้นทางสัมพัทธ์ อย่างไรก็ตาม$search_dirมีไฟล์จำนวนมากที่มีช่องว่างในชื่อ ในกรณีนี้สคริปต์นี้ไม่ทำงานตามที่คาดไว้ ฉันรู้ว่าฉันสามารถใช้งานfor entry in *ได้ แต่มันจะใช้ได้เฉพาะกับไดเรกทอรีปัจจุบันของฉันเท่านั้น ฉันรู้ว่าฉันสามารถเปลี่ยนไปยังไดเรกทอรีfor entry in *นั้นใช้แล้วเปลี่ยนกลับ แต่สถานการณ์เฉพาะของฉันทำให้ฉันไม่สามารถทำได้ ฉันมีสองเส้นทางญาติ$search_dirและ$work_dirและฉันต้องทำงานทั้งสองพร้อมกันอ่านพวกเขาสร้าง / ลบไฟล์ในพวกเขา ฯลฯ แล้วฉันจะทำอย่างไรดี PS: ฉันใช้ทุบตี

7
Bash foreach loop
ฉันมีอินพุต (สมมุติว่าไฟล์) ในแต่ละบรรทัดจะมีชื่อไฟล์ ฉันจะอ่านไฟล์นี้และแสดงเนื้อหาสำหรับแต่ละไฟล์ได้อย่างไร
158 bash  foreach 

4
คำสั่งส่งออก UNIX [ปิด]
ปิด. คำถามนี้เป็นคำถามปิดหัวข้อ ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นไปตามหัวข้อสำหรับ Stack Overflow ปิดให้บริการใน8 ปีที่ผ่านมา ปรับปรุงคำถามนี้ ฉันพยายามเข้าใจการใช้exportคำสั่ง ฉันพยายามใช้man exportแต่ไม่มีคู่มือสำหรับคำสั่งนี้ ใครช่วยกรุณาทำความเข้าใจเกี่ยวกับการใช้exportใน UNIX?
158 bash  shell  unix 

10
รับวันที่เมื่อวานในทุบตีบน Linux, DST- ปลอดภัย
ฉันมีเชลล์สคริปต์ที่ทำงานบน Linux และใช้สายนี้เพื่อรับวันที่ในYYYY-MM-DDรูปแบบของเมื่อวาน: date -d "1 day ago" '+%Y-%m-%d' มันทำงานมากที่สุดของเวลา แต่เมื่อสคริปต์วิ่งตอนเช้าเมื่อวานนี้ที่2013-03-11 0:35 CDTมันกลับมาแทน"2013-03-09""2013-03-10" น่าจะเป็นการปรับเวลาตามฤดูกาล (ซึ่งเริ่มเมื่อวานนี้) ฉันคาดเดาวิธีการที่"1 day ago"จะดำเนินการก็หักออก 24 ชั่วโมงและ 24 ชั่วโมงก่อนที่จะ2013-03-11 0:35 CDTเป็นซึ่งนำไปสู่ผลมาจากการ2013-03-09 23:35 CST"2013-03-09" ดังนั้นวิธีการที่ดีเวลาที่ปลอดภัยที่จะได้รับวันที่เมื่อวานในทุบตีบน Linux คืออะไร?
158 linux  bash 

6
ส่งสตริงไปยัง stdin
มีวิธีในการทำเช่นนี้อย่างมีประสิทธิภาพในทุบตี: /my/bash/script < echo 'This string will be sent to stdin.' ฉันรู้ว่าฉันสามารถส่งออกท่อจากเสียงสะท้อนเช่นนี้: echo 'This string will be piped to stdin.' | /my/bash/script

11
Bash: การนอนไม่ จำกัด (การปิดกั้นแบบไม่ จำกัด )
ผมใช้startxในการเริ่มต้น X .xinitrcซึ่งจะประเมินผลการศึกษาของฉัน ในของฉันฉันจะเริ่มต้นจัดการหน้าต่างของฉันโดยใช้.xinitrc /usr/bin/mywmตอนนี้ถ้าฉันฆ่า WM ของฉัน (เพื่อทดสอบ WM อื่น ๆ ) X จะสิ้นสุดเช่นกันเพราะ.xinitrcสคริปต์มาถึง EOF ดังนั้นฉันจึงเพิ่มสิ่งนี้ในตอนท้ายของ.xinitrc: while true; do sleep 10000; done วิธีนี้ X จะไม่ยุติลงถ้าฉันฆ่า WM ของฉัน ตอนนี้คำถามของฉัน: ฉันจะนอนหลับไม่ จำกัดแทนการวนลูปได้อย่างไร มีคำสั่งที่จะชอบแช่แข็งสคริปต์หรือไม่ ขอแสดงความนับถืออย่างสูง
158 linux  bash  sleep  infinite 

11
ทุบตีสายต่อเนื่อง
คุณจะใช้สายต่อเนื่อง bash ได้อย่างไร? ฉันรู้ว่าคุณสามารถทำได้: echo "continuation \ lines" >continuation lines อย่างไรก็ตามหากคุณมีรหัสที่เยื้องมันก็ไม่ได้ผลดีนัก: echo "continuation \ lines" >continuation lines
158 bash  line  indentation 

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