Nếu bash <tập tin> tập tin, thì tại sao nguồn của tập tin <tập tin> tập tin bị lỗi?


26

Tôi có đoạn script sau:

#!/bin/bash
set -x
if :; then
    echo a
fi

Nếu tôi chạy bash /tmp/file, ađược lặp lại, nhưng nếu tôi chạy source /tmp/file, tôi nhận được:

bash: /tmp/test: line 6: syntax error: unexpected end of file

Đầu ra:

knezi@holly tmp]$set -x; source /tmp/test; set +x
+ source /tmp/test
++ set -x
bash: /tmp/test: line 6: syntax error: unexpected end of file
+ set +x

knezi@holly tmp]$set -x; command source /tmp/test; set +x
+ set -x
+ command source /tmp/test
+ source /tmp/test
++ set -x
bash: /tmp/test: line 6: syntax error: unexpected end of file
+ set +x

knezi@holly tmp]$bash -c "source /tmp/test"
+ bash -c 'source /tmp/test'
++ :
++ echo a
a


knezi@holly tmp]$od -c /tmp/test
0000000   #   !   /   b   i   n   /   b   a   s   h  \n   s   e   t    
0000020   -   x  \n   i   f       :   ;       t   h   e   n  \n  \t   e
0000040   c   h   o       a  \n   f   i  \n
0000051

Đầu ra của các lệnh shopt -pset -o: http://pastebin.com/bsqc8aru

Đầu ra của set: http://pastebin.com/S9KpqZAL

declare -fp sản xuất không có gì.

Tôi nghĩ rằng sourcenó cũng giống như vậy bash, nhưng thay vì bắt đầu phiên mới thay vì chạy mã trong phiên hiện tại. Bất cứ ai có thể giải thích lỗi này cho tôi?

Tôi chạy bash GNU bash, phiên bản 4.2.53 (1) -release (x86_64-redhat-linux-gnu).


1
Không, đây là toàn bộ mã. Dòng mới là 0a.
knezi

2
@Rahul mã thập lục phân của ký tự dòng Unix
PSkocik

2
$BASH_ENVbộ?
roaima

2
@PSkocik thật là kỳ lạ. bash -c "nguồn / tmp / test" hoạt động.
knezi

5
À ha! Vui lòng thêm rằng nó hoạt động với bash -ccâu hỏi của bạn. Sau đó, cho chúng tôi xem nội dung của ~/.bashrctập tin của bạn , có thể có thứ gì đó đang làm hỏng mọi thứ.
terdon

Câu trả lời:


75

Tôi có thể tái tạo hành vi của bạn nếu tôi bí danh fi:

$ alias fi=:
+ alias fi=:
$ . ./test
+ . ./test
++ set -x
bash: ./test: line 6: syntax error: unexpected end of file

Nó hoạt động khi bạn thực thi nó nhưng thất bại khi bạn nguồn nó vì các bí danh không có sẵn trong các shell không tương tác (loại shell chạy các script shell). Như đã giải thích trong hướng dẫn sử dụng bash :

Bí danh không được mở rộng khi shell không tương tác, trừ khi expand_aliasestùy chọn shell được đặt bằng cách sử dụng shopt(xem The Shopt Buildin ).

Tuy nhiên, khi bạn sourcemột cái gì đó, nó được chạy trong shell hiện tại của bạn, vì nó tương tác, đã tải các bí danh và do đó fibí danh được nhận ra và phá vỡ nguồn.


16
Bạn hoàn toàn đúng. Tôi đã đặt: bí danh fi = 'find -type f | xargs grep -H '.
knezi

7
Loại bỏ điều đó aliasngay bây giờ! :)
Mark Stewart

9
Tôi ngạc nhiên khi bất cứ ai quản lý để tìm ra một vấn đề mơ hồ như vậy. Làm tốt lắm, thưa ngài.
Toán học hoặc

6
@MathologistsOrchid Tôi nghi ngờ rằng một cái gì đó đã được đặt bí danh (vì vỏ tương tác), setđã bị loại trừ bởi đầu ra, và alias if='foo "'(một trích dẫn mở ra đã đưa ra một lỗi về trích dẫn bị thiếu, và vì vậy tùy chọn cuối cùng là bí danh fi.
muru
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.