คำถามติดแท็ก shell-script

คำถามเกี่ยวกับเชลล์สคริปต์ไฟล์เรียกทำงานที่ตีความโดยเชลล์ (bash, zsh ฯลฯ )

1
คัดลอกไฟล์และเพิ่มการประทับเวลาต่อท้าย
ฉันมีสองปัญหากับสคริปต์ของฉันที่คัดลอกไฟล์และเพิ่มการประทับเวลาให้กับชื่อ cp -ra /home/bpacheco/Test1 /home/bpacheco/Test2-$(date +"%m-%d-%y-%T") ดังกล่าวข้างต้นจะเพิ่มTest2เป็นชื่อไฟล์ Testแต่ฉันต้องการที่จะให้ชื่อไฟล์ไฟล์ต้นฉบับซึ่งในตัวอย่างนี้เป็นชื่อ cp -ra /home/bpacheco/Test1 /home/bpacheco/Test2-$(date +"%m-%d-%y-%r") ปัญหาอื่น ๆ คือเมื่อฉันเพิ่ม%rเป็นรหัสเวลาที่ฉันได้รับข้อผิดพลาดระบุว่า "PM" เป้าหมายไม่ได้เป็นไดเรกทอรี ฉันกำลังพยายามที่จะได้รับการประทับเวลาเป็นเวลานาฬิกา 12 ชั่วโมง

4
ฉันจะรันคำสั่งและรับรหัสการออกโดยใช้อักขระน้อยลงได้อย่างไร
ฉันเคยเขียนสคริปต์ของฉันเช่นนี้: some_command while [ $? -ne 0 ] ; do sleep 1 some_command done มันทำให้ฉันรำคาญอยู่เสมอว่าฉันต้องเขียนsome_commandสองครั้ง ฉันสามารถวางมันไว้ในส่วนการทดสอบลูปได้ไหม?

9
เครื่องมือบรรทัดคำสั่งเพื่อ“ cat” การขยายแบบคู่ของแถวทั้งหมดในไฟล์
สมมติว่าฉันมีไฟล์ (เรียกว่า sample.txt) ที่มีลักษณะดังนี้: Row1,10 Row2,20 Row3,30 Row4,40 ฉันต้องการที่จะทำงานกับสตรีมจากไฟล์นี้ซึ่งเป็นการรวมกันแบบคู่ของทั้งสี่แถว (ดังนั้นเราควรจะจบด้วย 16 ทั้งหมด) ตัวอย่างเช่นฉันกำลังมองหาคำสั่งสตรีม (เช่นมีประสิทธิภาพ) โดยที่เอาต์พุตคือ: Row1,10 Row1,10 Row1,10 Row2,20 Row1,10 Row3,30 Row1,10 Row4,40 Row2,20 Row1,10 Row1,20 Row2,20 ... Row4,40 Row4,40 กรณีการใช้งานของฉันคือฉันต้องการสตรีมเอาต์พุตนี้ไปยังคำสั่งอื่น (เช่น awk) เพื่อคำนวณเมทริกบางส่วนเกี่ยวกับชุดค่าผสมแบบคู่นี้ ฉันมีวิธีที่จะทำสิ่งนี้ใน awk แต่ข้อกังวลของฉันคือการใช้บล็อก END {} ของฉันหมายความว่าฉันกำลังเก็บไฟล์ทั้งหมดไว้ในหน่วยความจำก่อนส่งออก รหัสตัวอย่าง: awk '{arr[$1]=$1} END{for (a in arr){ for (a2 in …

2
เมื่อรันเชลล์สคริปต์เป็นไปได้หรือไม่ที่จะส่งพารามิเตอร์ตำแหน่งเฉพาะโดยไม่ต้องป้อนทั้งหมดตามลำดับ
ตัวอย่างเช่นถ้าฉันมีสคริปต์. / foo ที่ใช้พารามิเตอร์ 10 ตัวและฉันต้องการส่งผ่านพารามิเตอร์ที่ 8 เท่านั้น วิธีเดียวที่ฉันรู้วิธีการทำในปัจจุบันคือ: ./foo '' '' '' '' '' '' '' 'bar' มีวิธีที่ง่ายกว่า / ดีกว่า?

1
ทำไมฉันต้องหลบหนี“ จุด” สองครั้ง?
ฉันรู้ว่าเราสามารถหลบหนีอักขระพิเศษเช่น*(){}$มี\เพื่อให้เป็นตัวอักษรถือว่า ตัวอย่างเช่น\*หรือ\$ แต่ในกรณีที่.ฉันต้องทำสองครั้งอย่าง\\.อื่นก็ถือว่าเป็นตัวละครพิเศษ ตัวอย่าง: man gcc | grep \\. ทำไมถึงเป็นเช่นนั้น?

3
วิธีการกำหนดฟังก์ชั่น Bash ที่สามารถใช้งานได้โดยสคริปต์ที่แตกต่างกัน
ฉันได้กำหนดbashฟังก์ชั่นใน~/.bashrcไฟล์ของฉัน สิ่งนี้ทำให้ฉันใช้มันในเทอร์มินัลเชลล์ อย่างไรก็ตามดูเหมือนว่าจะไม่มีอยู่เมื่อฉันเรียกมันจากภายในสคริปต์ ฉันจะกำหนดbashฟังก์ชั่นที่สคริปต์ใช้งานได้อย่างไร?

4
วิธีทำการแทนที่แบบแทนที่ภายในที่สร้างเฉพาะการสำรองข้อมูลของไฟล์ที่เปลี่ยนแปลงไปแล้ว?
ฉันรันสิ่งต่อไปนี้เพื่อแทนที่คำที่ใช้ในไฟล์ทั้งหมดในไดเรกทอรีการทำงานปัจจุบัน: $ find . -type f -print0 | xargs -0 sed -i'.bup' -e's/Ms. Johnson/Mrs. Melbin/g' สิ่งนี้ดำเนินการแทนที่คำ แต่ยังสร้าง.bupไฟล์ของไฟล์ที่ไม่เคยมีMs. Johnsonสตริง ฉันจะทำการทดแทนโดยไม่สร้างการสำรองข้อมูลที่ไม่จำเป็นเหล่านี้ทั้งหมดได้อย่างไร

3
`ls -s` พิมพ์“ 0” เมื่อใด
แน่นอนวิธีมาตรฐานในการทดสอบว่าไฟล์ว่างเปล่าtest -s FILEแต่ลูกค้าคนหนึ่งของเราได้รับสคริปต์ที่มีการทดสอบดังนี้: RETVAL=`ls -s ./log/cr_trig.log | awk '{print $1}'` if test $RETVAL -ne 0 then echo "Badness: Log not empty" exit 25 fi ด้วยการอ้างสิทธิ์จากซัพพลายเออร์ว่าทำงานได้ในสภาพแวดล้อมทั้งสองที่พวกเขาได้ทำการทดสอบมาโดยไม่จำเป็นต้องบอกว่ามันล้มเหลวทั้งสองแห่งที่ฉันทดสอบ ดังนั้นฉันอยากรู้ เมื่อไหร่ls -sพิมพ์0ไฟล์เปล่า? นี่คือสิ่งที่ฉันค้นพบ: GFS บน Linux: 4 ext4 บน Linux: 0 ZFS บน Solaris: 1 UFS บน Solaris: 0 jfs บน AIX: 0 VxFS …

2
จะส่งตัวแปรไปยังสคริปต์ที่เปิดใช้งานรูทได้อย่างปลอดภัยได้อย่างไร
คำถามนี้เป็นคำถามทั่วไปและไม่เพียง แต่ใช้กับสถานการณ์ของฉันเท่านั้น แต่ ... ฉันมีเครื่องมือ busybox ขนาดเล็กที่ฉันต้องการให้ผู้ใช้ที่ไม่ใช่รูทสามารถรันสคริปต์เฉพาะกับสิทธิ์พิเศษของรูทได้ ตัวอย่างเช่นบางสิ่งบางอย่างเช่นสคริปต์ขนาดเล็กนี้เพื่อเปิดใช้งาน DHCP โดยที่ตัวแปรเดียว ( $1) เพื่อส่งเข้าสู่ cmdline (!!) คือชื่อโฮสต์ที่จะส่งออก: #!/bin/bash udhcpc -b -i eth0 -h $1 การเรียกใช้ udhcpc เช่นนี้ต้องใช้การเข้าถึงรูทดังนั้นฉันวางแผนที่/etc/sudoersจะแก้ไขเพื่อให้มีบรรทัดนี้: joe ALL = NOPASSWD: /path/to/enable_dhcp.sh ซึ่งควรเปิดใช้งาน "joe" เพื่อให้เรียกใช้สคริปต์นั้นได้อย่างง่ายดายด้วยสิทธิ์พิเศษของรูทเพียงแค่เรียกใช้: sudo /path/to/enable_dhcp.sh และไม่ถูกถามหารหัสผ่าน (ซึ่งเป็นสิ่งที่ฉันต้องการเนื่องจากฉันต้องการให้โจสามารถเขียนสคริปต์นี้ได้) ตอนนี้ .. ฉันรู้แล้ว (หรืออย่างน้อยฉันก็คิดว่า) การใช้$1สคริปต์ที่สามารถรันได้อย่างง่ายดายด้วยสิทธิ์พิเศษของรูทเป็นแนวคิดที่น่ากลัวเพราะคุณสามารถฉีดสิ่งที่คุณต้องการได้ ดังนั้น ... วิธีที่ดีที่สุดในการจัดการกับเรื่องนี้คืออะไร? ฉันจะปล่อยให้โจทำสิ่งที่ฉันต้องการด้วยสิทธิ์ของรูทอนุญาตให้เขาส่งผ่านตัวแปร (หรือทำอย่างนั้นได้อย่างมีประสิทธิภาพเหมือนกับตัวแปรสภาพแวดล้อม) ในขณะที่ไม่เปิดกว้างสำหรับการโจมตีแบบฉีด


1
วิธีการเปิดใช้งาน Virtualenv เมื่อสคริปต์ Python เริ่มทำงาน?
ฉันต้องการที่จะกำหนดเวลาหลามสคริปต์เพื่อเรียกใช้ cron ในบางวันปัญหาคือว่าเพื่อให้example.pyการทำงานexample-envจะต้องมีการเปิดใช้งานจะมีวิธีที่จะทำให้การexample.pyเปิดใช้งาน virtualenv ของตัวเองเมื่อใดก็ตามที่ cron ดำเนินการได้หรือไม่ ถ้าไม่เช่นนั้นฉันต้องสร้างสคริปต์ทุบตีbash.shที่มี #!/usr/bin/env bash workon example-env python2 example.py แล้วกำหนดเวลาที่จะดำเนินการโดย cron ในบางวัน? หรือฉันต้องทำอย่างอื่น? ทั้งสองวิธีใช้ได้กับฉันฉันแค่อยากรู้วิธีที่ถูกต้องในการทำ บางทีฉันอาจชอบวิธีการทุบตีสคริปต์เนื่องจากฉันมีไฟล์ Python จำนวนมากที่จะทำงานดังนั้นถ้าฉันวางไว้ในสคริปต์ทุบตีและกำหนดเวลานั้นดูเหมือนว่าง่ายกว่าสำหรับฉัน แต่อีกครั้งฉันไม่รู้วิธีที่ถูกต้องที่จะทำ ดังนั้นฉันขอคำแนะนำ

1
เหตุใด PGID ของลูกของฉันจึงไม่ประมวลผล PID ของผู้ปกครอง
ดังนั้นฉันจึงอ่านทุกที่ว่าคำสั่งนี้ควรยุติกระบวนการลูกทั้งหมดของกระบวนการหลัก: kill -- -$$ การใช้ ID เชิงลบพร้อมกับคำสั่ง kill อ้างอิง PGID และจากตัวอย่างที่ฉันเห็นมันปรากฏว่า PGID ของกระบวนการลูกควรเป็น PID ของผู้ปกครอง แต่ไม่ใช่กรณีในระบบของฉัน ในระบบของฉัน PGID ของเด็กนั้นเหมือนกับ PGID ของสคริปต์หลักซึ่งกลายเป็นทุบตี เกิดอะไรขึ้นที่นี่? ตัวอย่างผิดหรือระบบของฉันตั้งค่าแตกต่างกันหรือไม่? สิ่งที่ฉันต้องทำให้สำเร็จคือการยุติกระบวนการลูกโดยไม่ต้องยุติพาเรนต์ดังนั้นฉันไม่ต้องการส่งสัญญาณการฆ่าไปยัง PGID ที่พาเรนต์เข้ามา

2
การสื่อสารระหว่างหลายกระบวนการ
ฉันมีสคริปต์ทุบตีซึ่งทำงานเป็นผู้จัดการ () ฟังก์ชั่นเป็นกระบวนการที่แยกต่างหากสำหรับ x- ครั้ง เป็นไปได้อย่างไรที่จะส่งต่อข้อความถึงกระบวนการทั้งหมด () จากผู้จัดการภายในสคริปต์? ฉันได้อ่านเกี่ยวกับไพพ์นิรนามแล้ว แต่ฉันไม่รู้ว่าจะแชร์ข้อความกับมันได้อย่างไรฉันลองทำมันด้วยชื่อไพพ์ แต่ดูเหมือนว่าฉันจะต้องสร้างไพพ์ที่มีชื่อแยกต่างหากสำหรับแต่ละกระบวนการ? วิธีที่สง่างามที่สุดในการทำเช่นนี้คืออะไร? นี่คือรหัสของฉัน: #!/bin/bash manager () { while : do echo "read what has been passed to \$line" done } x=1 while [ $x -le 5 ] do manager x & x=$(( $x + 1 )) done while : do …

2
ตรวจสอบการอ้างอิงสคริปต์ bash / shell
มีวิธี / คำสั่งเพื่อตรวจสอบการพึ่งพาของ bash script หรือไม่ กล่าวอีกนัยหนึ่งการตอบคำถามนี้: ผู้ใช้ควรติดตั้งไลบรารีใดเพื่อเรียกใช้สคริปต์ ฉันสามารถทำได้ด้วยตนเองโดยการอ่านสคริปต์และตรวจสอบว่าไลบรารี / คำสั่งอื่น ๆ เรียกใช้ แต่สิ่งนี้ไม่ชัดเจนสำหรับสคริปต์แบบยาว

5
วิธีการจับข้อผิดพลาดในสคริปต์ทุบตีลินุกซ์?
ฉันทำสคริปต์ต่อไปนี้: # !/bin/bash # OUTPUT-COLORING red='\e[0;31m' green='\e[0;32m' NC='\e[0m' # No Color # FUNCTIONS # directoryExists - Does the directory exist? function directoryExists { cd $1 if [ $? = 0 ] then echo -e "${green}$1${NC}" else echo -e "${red}$1${NC}" fi } # EXE directoryExists "~/foobar" directoryExists "/www/html/drupal" สคริปต์ทำงานได้ แต่ข้างก้องของฉันก็มีเอาต์พุตเมื่อ cd …

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