Bắt lỗi chuyển hướng mơ hồ của người dùng


173

Dòng sau trong tập lệnh Bash của tôi

 echo $AAAA"     "$DDDD"         "$MOL_TAG  >>  ${OUPUT_RESULTS}

cho tôi lỗi này:

 line 46: ${OUPUT_RESULTS}: ambiguous redirect

Tại sao?


10
bạn không thể hiện tất cả bạn đã nhận được ở ${OUPUT_RESULTS}đâu Đó cũng là một lỗi chính tả nếu bạn muốn nói$OUTPUT_RESULTS}
ghostdog74 17/03/2016

nếu một người viết OUPUT_RESULTS = "filename.log"sẽ nhận được chuyển hướng mơ hồ. Bởi vì bash muốn KHÔNG CÓ KHÔNG GIAN xung quanh =nhà điều hành.
Poutrathor

Câu trả lời:


269

Bash đôi khi có thể khá khó hiểu.

Tất cả các lệnh sau đây đều trả về các thông báo lỗi khác nhau về cơ bản cùng một lỗi:

$ echo hello >
bash: syntax error near unexpected token `newline`

$ echo hello > ${NONEXISTENT}
bash: ${NONEXISTENT}: ambiguous redirect

$ echo hello > "${NONEXISTENT}"
bash: : No such file or directory

Thêm dấu ngoặc kép xung quanh biến có vẻ là một cách tốt để xử lý thông báo "chuyển hướng mơ hồ": Bạn có xu hướng nhận được thông báo tốt hơn khi bạn mắc lỗi đánh máy - và khi lỗi là do khoảng trắng trong tên tệp, sử dụng dấu ngoặc kép là sửa chữa.


1
Bạn cũng sẽ nhận được điều này nếu bạn chuyển hướng đầu ra của một tập lệnh có chứa các chuyển hướng. Đừng hỏi tôi làm thế nào tôi biết điều này.
Paul Jackson

@PaulJackson, ... điều đó không đúng. Là một người biểu tình sao chép và dán: sh -c 'echo hello >/tmp/hello' >/tmp/worldhoạt động đúng.
Charles Duffy

24

Bạn có một biến được đặt tên OUPUT_RESULTShoặc nó có nhiều khả năng OUTPUT_RESULTS?


michael@isolde:~/junk$ ABC=junk.txt
michael@isolde:~/junk$ echo "Booger" > $ABC
michael@isolde:~/junk$ echo "Booger" >> $ABB
bash: $ABB: ambiguous redirect
michael@isolde:~/junk$ 

2
Nếu bạn ABC="junk file.txt", điều này vẫn sẽ có vấn đề.
Charles Duffy

15

đặt dấu ngoặc kép quanh biến của bạn. Nếu nó có không gian, nó cũng sẽ cung cấp cho bạn "chuyển hướng mơ hồ". cũng kiểm tra chính tả của bạn

echo $AAAA"     "$DDDD"         "$MOL_TAG  >>  "${OUPUT_RESULTS}"

ví dụ: chuyển hướng mơ hồ

$ var="file with spaces"
$ echo $AAAA"     "$DDDD"         "$MOL_TAG >> ${var}
bash: ${var}: ambiguous redirect
$ echo $AAAA"     "$DDDD"         "$MOL_TAG >> "${var}"
$ cat file\ with\ spaces
aaaa     dddd         mol_tag

1
Trích dẫn không quan trọng. Nếu có khoảng trắng trong phần mở rộng biến, bạn sẽ nhận được những thứ đi đến tệp sai và / hoặc thông báo lỗi giả liên quan đến phần không gian sau của tên tệp.
CHỈ CẦN HOẠT ĐỘNG CỦA TÔI 17/03/2016

@JUSTMYc CorrOPINION, shell không phân tích lại sau khi mở rộng tham số - có nghĩa là nội dung sau khoảng trống trong kết quả mở rộng không thể dẫn đến một đoạn cú pháp khác được điền vào.
Charles Duffy

5

Gần đây tôi đã phát hiện ra rằng các khoảng trống trong tên của tệp chuyển hướng sẽ gây ra thông báo "chuyển hướng mơ hồ".

Ví dụ: nếu bạn chuyển hướng đến application$(date +%Y%m%d%k%M%S).logvà bạn chỉ định các ký tự định dạng sai, ví dụ chuyển hướng sẽ thất bại trước 10 giờ sáng. Tuy nhiên, nếu bạn sử dụng application$(date +%Y%m%d%H%M%S).lognó sẽ thành công. Điều này là do %kđịnh dạng mang lại ' 9'cho 9AM trong đó %Hsản lượng '09'cho 9AM.

echo $(date +%Y%m%d%k%M%S) cho 20140626 95138

echo $(date +%Y%m%d%H%M%S) cho 20140626095138

Ngày sai lầm có thể cho một cái gì đó như:

echo "a" > myapp20140626 95138.log

trong đó sau đây là những gì sẽ được mong muốn:

echo "a" > myapp20140626095138.log

Lỗi là bạn nên có dấu ngoặc kép quanh biến, bất kể nó có chứa khoảng trắng hay không. Xem Khi nào cần bọc dấu ngoặc kép quanh một biến shell?
tripleee

5

Đường dẫn được chỉ định trong $ {OUPUT_RESULTS} có chứa bất kỳ ký tự khoảng trắng nào không? Nếu vậy, bạn có thể muốn xem xét sử dụng... >> "${OUPUT_RESULTS}" (sử dụng dấu ngoặc kép).

(Bạn cũng có thể muốn xem xét đổi tên biến của mình thành ${OUTPUT_RESULTS})


1

Tôi chỉ có lỗi này trong một tập lệnh bash. Vấn đề là một sự cố tình cờ \ ở cuối dòng trước đó đã báo lỗi.


1

Một điều khác có thể gây ra "chuyển hướng mơ hồ" là \t \n \rtrong tên biến bạn cũng đang viết

Có lẽ không \n\r? Nhưng lỗi ở phía thận trọng

Thử cái này

echo "a" > ${output_name//[$'\t\n\r']}

Tôi đã gặp phải vấn đề này khi phân tích cú pháp HTML, Tab \tở đầu dòng.


Lỗi không được trích dẫn biến. Xem Khi nào cần bọc dấu ngoặc kép quanh một biến shell?
tripleee

1

Nếu chuyển hướng tập lệnh của bạn chứa một biến và phần thân tập lệnh xác định biến đó trong phần được bao quanh bởi dấu ngoặc đơn, bạn sẽ gặp lỗi "chuyển hướng mơ hồ". Đây là một ví dụ có thể tái tạo:

  1. vim a.sh để tạo kịch bản
  2. chỉnh sửa tập lệnh để chứa (logit="/home/ubuntu/test.log" && echo "a") >> ${logit}
  3. chmod +x a.sh để làm cho nó thực thi
  4. a.sh

Nếu bạn làm điều này, bạn sẽ nhận được "/home/ubfox/a.sh: dòng 1: $ logit: chuyển hướng mơ hồ". Đây là vì

"Việc đặt danh sách các lệnh giữa các dấu ngoặc đơn sẽ tạo ra một lớp con và mỗi lệnh trong danh sách sẽ được thực thi trong lớp con đó, mà không loại bỏ các biến không xuất. Vì danh sách được thực thi trong một lớp con, các phép gán biến không còn có hiệu lực sau khi lớp vỏ hoàn thành. "

Từ Sử dụng dấu ngoặc đơn để nhóm và mở rộng biểu thức

Để sửa lỗi này, bạn có thể sửa đổi tập lệnh trong bước 2 để xác định biến ngoài dấu ngoặc đơn: logit="/home/ubuntu/test.log" && (echo "a") >> $logit


0

nếu bạn đang sử dụng một tên biến trong lệnh shell, bạn phải ghép nó với +dấu.

ví dụ :

nếu bạn có hai tệp và bạn sẽ không mã cứng tên tệp, thay vào đó bạn muốn sử dụng tên biến
"input.txt" = x
"output.txt" = y

sau đó ('lệnh shell trong dấu ngoặc kép' + x> + y)

nó sẽ hoạt động theo cách này đặc biệt nếu bạn đang sử dụng chương trình này trong chương trình python với lệnh os.system


0

Đây cũng có thể là trường hợp.

bạn chưa chỉ định tệp trong một biến và chuyển hướng đầu ra cho nó, sau đó bash sẽ đưa ra lỗi này.

files=`ls`
out_file = /path/to/output_file.t
for i in `echo "$files"`;
do
    content=`cat $i` 
    echo "${content}  ${i}" >> ${out_file}
done

Biến out_file không được thiết lập chính xác, vì vậy hãy chú ý đến điều này. BTW mã này đang in tất cả nội dung và tên tệp của nó trên bàn điều khiển.


0

Tôi đã gặp lỗi này khi cố gắng sử dụng mở rộng dấu ngoặc để ghi đầu ra vào nhiều tệp.

ví dụ: echo "text" > {f1,f2}.txtkết quả trong-bash: {f1,f2}.txt: ambiguous redirect

Trong trường hợp này, sử dụng teeđể xuất ra nhiều tệp:

echo "text" | tee {f1,f2,...,fn}.txt 1>/dev/null

ý 1>/dev/nullchí sẽ ngăn văn bản được viết thành thiết bị xuất chuẩn

Nếu bạn muốn thêm vào (các) tập tin, hãy sử dụng tee -a

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.