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

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

2
ความสมบูรณ์ของคำสั่งสำหรับ `cd` สามารถปรับเปลี่ยนเพื่อแสดงเฉพาะไดเรกทอรีและละเว้นไฟล์ได้หรือไม่
เมื่อฉันอยู่ในไดเรกทอรีในทุบตีและฉันกดcd Space Tabมันจะแสดงทุกอย่างในไดเรกทอรีเป็นไปได้ ( Show all 1000 possibilities?) นี่มันยุ่งยากจริงๆเมื่อฉันอยู่ในไดเรกทอรีที่มีไฟล์ปกติจำนวนมากและมีไดเรกทอรีค่อนข้างน้อย ดังนั้นจึงเป็นไปได้ที่จะเลือกตัวเลือกสำหรับการเติมข้อความอัตโนมัติcdเพื่อรวมเฉพาะไดเรกทอรีหรือไม่ ฉันรู้ว่าฉันจะได้รับรายชื่อไดเรกทอรีภายในไดเรกทอรีโดยทำ ls -d */ แต่ฉันไม่แน่ใจว่าจะดำเนินการต่อจากที่นั่นได้อย่างไร ฉันใช้CentOS 6.6 รอบชิงชนะเลิศ

2
ฉันจะค้นหาจำนวนของเส้นแนวตั้งที่มีอยู่ในเครื่องได้อย่างไร
ฉันกำลังเขียนสคริปต์ซึ่งแสดงบันทึก git สำหรับไดเรกทอรีเมื่อฉันเข้าไป บันทึกดังกล่าวอาจมีจำนวนหลายร้อยบรรทัด จนถึงตอนนี้ฉันได้ จำกัด ไว้แค่ 20 บรรทัด ( ... | head -n 20) ซึ่งใช้งานได้ดีบนหน้าจอ แต่ก็มากเกินไปสำหรับหน้าจอ MacBook ขนาดเล็กที่บ้าน ฉันต้องการให้บันทึกใช้เวลาประมาณครึ่งหนึ่งของหน้าจอ (แนวตั้ง) บนเทอร์มินัลทั้งสอง และ "เทอร์มินัล" ก็เปลี่ยนเช่นกันมันคือ Gnome terminal ในที่ทำงาน แต่ iTerm2 อยู่ที่บ้าน และฉันไม่ได้ใช้หน้าจอหรือ tmux ฉันจะค้นหาจำนวนของเส้นแนวตั้งที่มีอยู่ในเทอร์มินัลจากบรรทัดคำสั่งได้อย่างไร

3
คุณยังคงประโยคต่อไปได้อย่างไรด้วยคำสั่งภายใน
ตัวอย่างเช่นฉันพยายามพูดว่า "มี 10 คนออนไลน์ในขณะนี้" ในไฟล์สคริปต์ของฉัน ฉันไม่สามารถดูเหมือนจะได้รับคำสั่งทำงานโดยไม่มีส่วน "คนออนไลน์ในขณะนี้" ในบรรทัดถัดไป ในตอนนี้ฉันมี w='who | wc -l' echo "There are $w people online at the moment" อย่างไรก็ตามฉันมักจะจบลงด้วยการส่งออก There are who | wc -l users online at the moment คุณจะทำให้คำสั่งทำงานตรงกลางได้อย่างไร? ฉันพยายามตรวจสอบและคัดลอกตัวอย่างแล้ว แต่ดูเหมือนจะไม่ช่วยให้ปัญหาการทดแทนคำสั่งของฉัน
12 bash  scripting 


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

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

2
กระบวนการทดแทนถูกนำมาใช้ในการทุบตี?
ฉันกำลังค้นคว้าคำถามอื่นเมื่อฉันรู้ว่าฉันไม่เข้าใจว่าเกิดอะไรขึ้นภายใต้ประทุน/dev/fd/*ไฟล์เหล่านั้นคืออะไรและกระบวนการของเด็กสามารถเปิดได้อย่างไร

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 

5
การล้างไฟล์โดยไม่รบกวนการเขียนไปป์
ฉันมีโปรแกรมที่ส่งออกฉันเปลี่ยนเส้นทางไปยังล็อกไฟล์: ./my_app > log ฉันต้องการล้าง (เช่นว่างเปล่า) บันทึกเป็นครั้งคราว (ตามต้องการ) และลองทำสิ่งต่าง ๆ เช่น cat "" > log อย่างไรก็ตามดูเหมือนว่าไปป์ดั้งเดิมจะถูกขัดจังหวะและโปรแกรมจะไม่เปลี่ยนเส้นทางเอาต์พุตไปยังล็อกไฟล์อีกต่อไป มีวิธีการทำเช่นนั้น? ปรับปรุง โปรดทราบว่าฉันไม่สามารถแก้ไขแอปพลิเคชันที่สร้างเอาต์พุต มันคายออกมาเป็น stdout และฉันต้องการบันทึกไว้ในบันทึกเพื่อที่ฉันจะได้ตรวจสอบเมื่อฉันต้องการมันและเคลียร์มันเมื่อฉันต้องการ อย่างไรก็ตามฉันไม่จำเป็นต้องรีสตาร์ทแอปพลิเคชัน

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 

5
จุดตัดของสองอาร์เรย์ใน BASH
ฉันมีสองอาร์เรย์ดังนี้: A=(vol-175a3b54 vol-382c477b vol-8c027acf vol-93d6fed0 vol-71600106 vol-79f7970e vol-e3d6a894 vol-d9d6a8ae vol-8dbbc2fa vol-98c2bbef vol-ae7ed9e3 vol-5540e618 vol-9e3bbed3 vol-993bbed4 vol-a83bbee5 vol-ff52deb2) B=(vol-175a3b54 vol-e38d0c94 vol-2a19386a vol-b846c5cf vol-98c2bbef vol-7320102b vol-8f6226cc vol-27991850 vol-71600106 vol-615e1222) อาร์เรย์ไม่ถูกเรียงลำดับและอาจมีองค์ประกอบที่ซ้ำกัน ฉันต้องการสร้างจุดตัดของทั้งสองอาร์เรย์และเก็บองค์ประกอบไว้ในอาร์เรย์อื่น ฉันจะทำอย่างไร นอกจากนี้ฉันจะดูรายการองค์ประกอบที่ปรากฏใน B และไม่มีใน A ได้อย่างไร
12 bash  scripting  array 

2
ค้นหาและลบรายการที่ซ้ำในไดเรกทอรี
ฉันมีไดเรกทอรีที่มีไฟล์ img หลายไฟล์และบางไฟล์เหมือนกัน แต่มีชื่อแตกต่างกัน ฉันต้องการลบรายการที่ซ้ำกัน แต่ไม่มีเครื่องมือภายนอกที่มีbashสคริปต์เท่านั้น ฉันเป็นผู้เริ่มต้นใน Linux ฉันลองซ้อนสำหรับ loop เพื่อเปรียบเทียบmd5ผลรวมและขึ้นอยู่กับผลการลบ แต่มีบางอย่างผิดปกติกับไวยากรณ์และมันไม่ทำงาน ความช่วยเหลือใด ๆ สิ่งที่ฉันพยายามคือ ... for i in directory_path; do sum1='find $i -type f -iname "*.jpg" -exec md5sum '{}' \;' for j in directory_path; do sum2='find $j -type f -iname "*.jpg" -exec md5sum '{}' \;' if test $sum1=$sum2 ; …

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 

5
จะทดสอบความขัดแย้งที่อาจเกิดขึ้นขณะใช้นามแฝงใน bashrc อย่างไร
มีวิธีง่าย ๆ ในการแสดงรายการความขัดแย้งของคำสั่งทั้งหมดที่เกิดขึ้นในระบบเนื่องจากการอัพเดต bashrc ที่เกี่ยวข้องกับคำสั่ง alias หรือไม่? ตัวอย่างเช่นมีคนเขียนเป็นalias ls=/path/to/user-generated/executablebashrc เราจะรู้ได้อย่างไรว่านี่เป็นการปกปิดคำสั่งจริง ( ls) วิธีหนึ่งดูเหมือนว่าจะเรียกใช้นามแฝงทั้งหมดก่อนและหลังการจัดหา bashrc และกระจายเอาต์พุต มีวิธีที่ดีกว่านี้อีกไหม? ฉันใช้ Ubuntu 12.04 ทุบตี - รุ่น GNU ทุบตีรุ่น 4.2.24 (1) - ปล่อย (i686-pc-linux-gnu)
12 bash  alias  bashrc 

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