Apakah boleh menggunakan "." menjalankan file alih - alih .bashrc di Ubuntu dan OS X?

11

OK, jadi sourcejalankan skrip di shell saat ini dan .secara terpisah, seperti yang dijelaskan dalam menjalankan skrip dengan "." Dan dengan "sumber" misalnya, tetapi, khususnya, di .bashrcfile saya , saya punya:

[ -f ~/.bash_aliases ] && source ~/.bash_aliases
[ -f ~/.git-completion.bash ] && source ~/.git-completion.bash
[ -s ~/.autojump/etc/profile.d/autojump.sh ] && source ~/.autojump/etc/profile.d/autojump.sh

Bisakah saya ganti ini dengan:

[ -f ~/.bash_aliases ] && . ~/.bash_aliases
[ -f ~/.git-completion.bash ] && . ~/.git-completion.bash
[ -s ~/.autojump/etc/profile.d/autojump.sh ] && . ~/.autojump/etc/profile.d/autojump.sh

Apakah itu akan berfungsi pada OS X - apakah itu masalah "POSIX"?

Saya mencobanya dan di atas sepertinya masih berfungsi di Ubuntu (jadi mereka benar-benar bekerja dengan keduanya sourcedan ., yaitu, mereka memberi saya fungsionalitas yang diinginkan di shell). Haruskah saya memilih satu dari yang lain, atau saya kehilangan sesuatu?

FWIW, pada OS X, saya sumber .bashrcdari saya .bash_profile.

Michael Durrant
sumber
1
Jika itu shell berbasis 'sh' saya akan menggunakan '.' untuk kompatibilitas global dan jika Anda menggunakan shell berbasis 'csh' saya akan menggunakan source.
mdpc
2
Di mana di pos yang ditautkan Anda melihat bahwa " sourcemenjalankan skrip di shell saat ini dan .secara terpisah"? Mereka berdua menjalankannya di shell saat ini; kalau tidak, tidak akan ada gunanya
Michael Mrozek

Jawaban:

11

Ini adalah definisi POSIX ini dari .dot:

Shell harus menjalankan perintah dari file di lingkungan saat ini.

Jika file tidak mengandung a /<slash>, shell harus menggunakan jalur pencarian yang ditentukan oleh $PATHuntuk menemukan direktori yang berisi file. Tidak seperti pencarian perintah normal, file yang dicari oleh .dot utilitas tidak perlu dieksekusi. Jika tidak ada file yang dapat dibaca ditemukan, shell non-interaktif akan dibatalkan; shell interaktif harus menulis pesan diagnostik untuk kesalahan standar, tetapi kondisi ini tidak akan dianggap sebagai kesalahan sintaksis.

Mempertimbangkan hal di atas, Anda bisa mengganti saja [ -f ./file ] && source ./filedengan Anda . ./file. Jika file tidak ada yang terburuk yang akan terjadi adalah Anda akan mendapatkan pemberitahuan saat login - yang mungkin informasi yang ingin Anda miliki, saya pikir.

Tentu saja jika Anda lebih suka mengikuti tes yang dapat Anda lakukan:

test -f ./file && . $_
mikeserv
sumber
2
Oh, orang-orang tahu $_, saya suka itu. :)
Andreas Wiese
@AndreasWiese - semua orang harus - itu hanya satu dari 7 parameter khusus yang didefinisikan oleh POSIX.
mikeserv
+1 Saya akhirnya menggunakan test -f /.file && . $_pendekatan yang ditunjukkan di sini
Michael Durrant
6
@ mikeserv Tidak, $_tidak distandarisasi oleh POSIX. The 8 parameter khusus yang $@, $*, $#, $$, $!, $?, $-dan $0. $_adalah eksplisit dihilangkan . Komentar Anda yang salah memicu pertanyaan .
Gilles 'SANGAT berhenti menjadi jahat'
19

Di bash, .dan sourcesinonim. Melihat ke bashkode sumber, file builtin/source.def, Anda dapat melihat .dan sourcemenggunakan fungsi internal yang sama source_builtin:

$BUILTIN source
$FUNCTION source_builtin
$SHORT_DOC source filename [arguments]
Execute commands from a file in the current shell.

Read and execute commands from FILENAME in the current shell.  The
entries in $PATH are used to find the directory containing FILENAME.
If any ARGUMENTS are supplied, they become the positional parameters
when FILENAME is executed.

Exit Status:
Returns the status of the last command executed in FILENAME; fails if
FILENAME cannot be read.
$END

$BUILTIN .
$DOCNAME dot
$FUNCTION source_builtin
$SHORT_DOC . filename [arguments]
Execute commands from a file in the current shell.

Tapi sourcetidak POSIX kompatibel, jadi jika naskah Anda disebut dengan POSIX /bin/sh, Anda harus menggunakan .bukan source. Karena POSIX tidak membatasi shell, semua skrip Anda di atas akan berfungsi.

Secara pribadi, saya selalu menggunakan .bukan source. (Banyak skrip yang saya tulis dijalankan di bawah cron).

cuonglm
sumber
Semua hal dianggap sama, gunakan "sumber" alih-alih "." karena satu alasan: coba cari / ambil "." ekspresi dalam skrip besar. Ini mimpi buruk.
abonet
Meskipun jawaban ini menjelaskan mengapa menggunakan .biasanya "lebih baik" daripada menggunakan source, seperti kata @abonet, sourcejauh lebih mudah untuk dicari. Karena tanda baca adalah tanda baca dalam banyak bahasa, mudah bagi mata untuk melewatinya. Itu sebabnya saya lebih suka menggunakan source.
Joe