Jika "bash <file>" berfungsi, mengapa "source <file>" melempar kesalahan?


26

Saya memiliki skrip berikut:

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

Jika saya berlari bash /tmp/file, adigaungkan, tetapi jika saya lari source /tmp/file, saya dapat:

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

Hasil:

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

Output dari perintah shopt -pdan set -o: http://pastebin.com/bsqc8aru

Output dari set: http://pastebin.com/S9KpqZAL

declare -fp tidak menghasilkan apa-apa.

Saya pikir itu sourcemelakukan hal yang sama bash, tetapi bukannya memulai sesi baru alih-alih menjalankan kode yang sekarang. Adakah yang bisa menjelaskan kesalahan ini kepada saya?

Saya menjalankan bash GNU bash, versi 4.2.53 (1) -release (x86_64-redhat-linux-gnu).


1
Tidak, ini seluruh kodenya. Baris baru adalah 0a.
knezi

2
@Rahul kode heksadesimal dari karakter linefeed Unix
PSkocik

2
Apakah $BASH_ENVset?
roaima

2
@ PSokik itu benar-benar aneh. bash -c "source / tmp / test" bekerja.
knezi

5
Ah-ha! Harap tambahkan bahwa itu berfungsi dengan bash -cpertanyaan Anda. Lalu, tunjukkan kami isi ~/.bashrcfile Anda , mungkin ada sesuatu di sana yang mengacaukan segalanya.
terdon

Jawaban:


75

Saya dapat mereproduksi perilaku Anda jika saya alias fi:

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

Ini bekerja ketika Anda menjalankannya tetapi gagal ketika Anda sumber karena alias tidak tersedia di shell non-interaktif (jenis shell yang menjalankan skrip shell). Seperti yang dijelaskan dalam manual bash :

Alias ​​tidak diperluas ketika shell tidak interaktif, kecuali jika expand_aliasesopsi shell diatur menggunakan shopt(lihat The Shopt Builtin ).

Namun, ketika Anda sourcesesuatu, itu dijalankan di shell Anda saat ini yang, karena bersifat interaktif, telah memuat alias dan oleh karena itu fialias diakui dan merusak sumber.


16
Anda sepenuhnya benar. Saya telah menetapkan: alias fi = 'find -type f | xargs grep -H '.
knezi

7
Singkirkan itu aliassekarang! :)
Mark Stewart

9
Saya heran bahwa ada yang berhasil memecahkan masalah yang tidak jelas seperti itu. Bagus, tuan.
MathematicalOrchid

6
@MathematicalOrchid Saya curiga ada sesuatu yang alias (karena shell interaktif), setdikesampingkan oleh output, dan alias if='foo "'(kutipan terbuka tertinggal memberikan kesalahan tentang kutipan yang hilang, dan opsi terakhir adalah fi
alias
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.