`1 >>` và` 2 >> `có nghĩa là gì trong tập lệnh bash?


15

Tôi có tập lệnh bash sau, từ những gì tôi hiểu >> được sử dụng để nối đầu ra của lệnh vào một tệp hiện có thay vì ghi đè, nhưng nó đang làm gì trong trường hợp này? Kịch bản này đang gọi một số tệp exe để chuyển đổi từ định dạng này sang định dạng khác. Có nhiều năm cho mỗi tệp, vì vậy nó lặp qua từng tệp bằng cách xem tên tệp. Ngoài ra khi tôi chạy tập lệnh này, tôi nhận được "chuyển hướng mơ hồ"

#!/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

Làm thế nào để bạn gọi kịch bản này?
Hauke ​​Laging 5/2/2015


@HaukeLaging, không, không phải vậy. Câu hỏi dường như là về một cái gì đó gần gũi, nhưng không giống nhau
Romeo Ninov

@RomeoNinov Bạn có phiền giải thích về sự khác biệt có liên quan không?
Hauke ​​Laging 5/2/2015

@HaukeLaging script được lưu trong tệp .sh. Tôi chỉ cần gõ ./myscript.sh
Herman Toothrot

Câu trả lời:


19

1>>2>>là các chuyển hướng cho các mô tả tệp cụ thể, trong trường hợp này là đầu ra tiêu chuẩn (mô tả tệp 1) và lỗi tiêu chuẩn (mô tả tệp 2).

Vì vậy, tập lệnh đang chuyển hướng tất cả các thông báo "tiêu chuẩn" đến ${jobout}và tất cả các thông báo lỗi đến ${joberr}. Sử dụng >>trong cả hai trường hợp có nghĩa là tất cả các tin nhắn được thêm vào các tệp tương ứng.

Lưu ý rằng ${jobout}${joberr}lấy các giá trị của chúng từ hai tham số dòng lệnh vào tập lệnh ( ${1}${2}), vì vậy bạn cần chỉ định các tệp bạn muốn sử dụng để lưu trữ thư. Nếu các tham số không được cung cấp, tập lệnh sẽ tạo ra thông báo lỗi "chuyển hướng mơ hồ" mà bạn đã thấy; kịch bản nên thực sự kiểm tra xem các tham số đã được cung cấp hay chưa và tạo ra một thông báo lỗi thích hợp, nếu không, giống như

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

khi bắt đầu kịch bản.


2

Trong trường hợp của bạn 1 >> nối thông tin từ trình xử lý xuất chuẩn hiện tại vào tệp $ {jobout} 2 >> nối thông tin từ trình xử lý stderr hiện tại vào tệp $ {joberr}

jobout và joberr là các tệp, được định nghĩa là tham số thứ nhất và thứ hai của tập lệnh


1

Vì không có tham số nào trong việc gọi script nên các tham số $1$2là trống rỗng và như vậy là $jobout$joberr.

Bạn phải gọi kịch bản như thế này:

./myscript.sh file1 file2

Số tham số không liên quan gì đến các số trước >>toán tử chuyển hướng.
Barmar

Đừng bận tâm, tôi thấy bạn đang trả lời phần về chuyển hướng mơ hồ, không phải câu hỏi trong tiêu đề. Bạn có lẽ nên làm cho câu trả lời của bạn rõ ràng hơn về điều này.
Barmar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.