`1 >> 'และ' 2 >> 'หมายถึงอะไรในสคริปต์ทุบตี?


15

ฉันมีสคริปต์ทุบตีต่อไปนี้จากสิ่งที่ฉันเข้าใจ >> ใช้เพื่อผนวกเอาท์พุทของคำสั่งไปยังไฟล์ที่มีอยู่แทนที่จะเขียนทับ แต่สิ่งที่ทำในกรณีนี้คืออะไร สคริปต์นี้กำลังเรียกไฟล์ exe บางไฟล์ให้แปลงจากรูปแบบหนึ่งไปยังอีกรูปแบบหนึ่ง แต่ละไฟล์มีหลายปีดังนั้นมันจึงวนซ้ำแต่ละไฟล์โดยดูที่ชื่อไฟล์ นอกจากนี้เมื่อฉันเรียกใช้สคริปต์นี้ฉันได้รับ "การเปลี่ยนเส้นทางคลุมเครือ"

#!/bin/bash
source $HOME/.bashrc

jobout=${1}
joberr=${2}

# Set some paths and prefixes

yr_bgn=2000
yr_end=2000

yr=${yr_bgn}
pth_data='/mnt/'
pth_rst='/mnt/'



while [ ${yr} -le ${yr_end} ]
do
   ./executable1 ${pth_data}file${yr}-${yr}.nc ${yr} ${pth_rst} 1>> ${jobout} 2>> ${joberr}
   ./executable2 ${pth_data}file${yr}-${yr}.nc ${yr} ${pth_rst} 1>> ${jobout} 2>> ${joberr}
   ./executable3 ${pth_data}file${yr}-${yr}.nc ${yr} ${pth_rst} 1>> ${jobout} 2>> ${joberr}
   let yr=${yr}+1
done

คุณเรียกสคริปต์นี้อย่างไร
Hauke ​​Laging


@HaukeLaging ไม่มันไม่ใช่ คำถามดูเหมือนจะเกี่ยวกับบางสิ่งบางอย่างใกล้ชิด แต่ไม่เหมือนกัน
Romeo Ninov

@RomeoNinov คุณจะอธิบายความแตกต่างที่เกี่ยวข้องหรือไม่?
Hauke ​​Laging

@HaukeLaging สคริปต์ถูกบันทึกในไฟล์. sh ฉันพิมพ์. /myscript.sh
Herman Toothrot

คำตอบ:


19

1>>และ2>>เป็นการเปลี่ยนเส้นทางสำหรับ file-descriptors เฉพาะในกรณีนี้เอาต์พุตมาตรฐาน (file descriptor 1) และข้อผิดพลาดมาตรฐาน (file descriptor 2)

ดังนั้นสคริปต์ที่มีการเปลี่ยนเส้นทางทุกข้อความ "มาตรฐาน" ไปและข้อความผิดพลาดทั้งหมดเพื่อ${jobout} ${joberr}การใช้>>ทั้งสองกรณีหมายถึงข้อความทั้งหมดจะถูกผนวกเข้ากับไฟล์ที่เกี่ยวข้อง

โปรดสังเกตว่า${jobout}และ${joberr}รับค่าจากพารามิเตอร์บรรทัดคำสั่งทั้งสองไปยังสคริปต์ ( ${1}และ${2}) ดังนั้นคุณต้องระบุไฟล์ที่คุณต้องการใช้เพื่อเก็บข้อความ หากไม่ได้รับพารามิเตอร์สคริปต์จะสร้างข้อความแสดงข้อผิดพลาด "การเปลี่ยนเส้นทางที่ไม่ชัดเจน" ที่คุณเห็น สคริปต์ควรตรวจสอบว่ามีการจัดเตรียมพารามิเตอร์และสร้างข้อความแสดงข้อผิดพลาดที่เหมาะสมหรือไม่เช่นนั้น

if [ -z "$1" -o -z "$2" ]; then
    echo "Log files for standard and error messages must be specified"
    echo "${0} msgfile errfile"
    exit 1
fi

ที่จุดเริ่มต้นของสคริปต์


2

ในกรณีของคุณ 1 >> ต่อท้ายข้อมูลจากตัวจัดการ stdout ปัจจุบันไปยังไฟล์ $ {jobout} 2 >> ผนวกข้อมูลจากตัวจัดการ stderr ปัจจุบันไปยังไฟล์ $ {joberr}

jobout และ joberr เป็นไฟล์ที่กำหนดเป็นพารามิเตอร์ตัวแรกและตัวที่สองของสคริปต์


1

เนื่องจากมีไม่มีพารามิเตอร์ในการเรียกร้องสคริปต์พารามิเตอร์$1และ$2ที่ว่างเปล่าและเพื่อให้มีและ$jobout$joberr

คุณต้องเรียกใช้สคริปต์เช่นนี้:

./myscript.sh file1 file2

หมายเลขพารามิเตอร์ไม่มีส่วนเกี่ยวข้องกับตัวเลขก่อน>>ตัวดำเนินการเปลี่ยนเส้นทาง
Barmar

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