Cangkang shell non-interaktif alias

12

Saya kesulitan mendapatkan alias untuk diperluas di akun hosting saya ketika saya menjalankan perintah seperti:

ssh user@server "bash -c \"alias\""

File .bashrc saya adalah:

echo .bashrc
# .bashrc

shopt -s expand_aliases

# Source global definitions (commenting this out does nothing)
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# User specific aliases and functions
alias php="php55"
alias composer="php ~/bin/composer.phar"

Ketika saya menjalankan perintah ssh di atas, saya melihat ".bashrc" digaungkan. Tetapi jika saya mencoba menjalankan alias, saya tidak mendapatkan apa-apa.

Saya dapat mencoba "bash -ic", tetapi ini sebenarnya dalam skrip yang tidak dapat saya ubah dengan mudah, dan saya ingin tahu mengapa ini tidak berhasil.

Output dari ssh user@server "bash -c \"shopt\""

.bashrc
autocd          off
cdable_vars     off
cdspell         off
checkhash       off
checkjobs       off
checkwinsize    off
cmdhist         on
compat31        off
compat32        off
compat40        off
dirspell        off
dotglob         off
execfail        off
expand_aliases  off
extdebug        off
extglob         off
extquote        on
failglob        off
force_fignore   on
globstar        off
gnu_errfmt      off
histappend      off
histreedit      off
histverify      off
hostcomplete    on
huponexit       off
interactive_comments    on
lithist         off
login_shell     off
mailwarn        off
no_empty_cmd_completion off
nocaseglob      off
nocasematch     off
nullglob        off
progcomp        on
promptvars      on
restricted_shell        off
shift_verbose   off
sourcepath      on
xpg_echo        off

Output dari ssh user@server "bash -c \"echo $SHELL\""

.bashrc
/bin/bash
Mat
sumber
Saya sudah menyerah dan baru saja membuat symlink dan skrip di ~ / bin yang melakukan hal yang sama yang saya inginkan dengan alias. Selama saya mengekspor saya $PATHkarena ~/bin:$PATHberfungsi dengan baik.
Matt
Di Ubuntu (16,04 dan yang lebih baru pasti) jika Anda memiliki ~/.local/binketika /etc/profilediproses akan secara otomatis menambahkannya ke PATH Anda. Anda juga bisa . /etc/profilesetelah membuat folder untuk menambahkannya ke PATH Anda tanpa reboot atau logout / login.
dragon788

Jawaban:

15

Dari bash(1)halaman manual:

Alias ​​tidak diperluas ketika shell tidak interaktif, kecuali jika opsi shell expansion_aliases diatur menggunakan shopt (lihat deskripsi shopt di bawah SHELL BUILTIN COMMANDS di bawah).

crimson-egret
sumber
5
Saya punya shopt -s expand_aliasesdi .bashrc saya, tapi itu sepertinya tidak berhasil. Saya tidak yakin mengapa tidak, tapi saya kira ini akan menjadi jawabannya secara normal
Matt
@ Mat Saya tidak yakin urutan 'acara', tetapi apakah Anda mencoba memastikan shopt -s expand_aliasesada di dalam Anda .bashrcsebelum alias? Tentu saja, output Anda dalam pertanyaan yang ditampilkan expand_aliasesadalah off.
crimson-egret
Ya, lihat .bashrc di pertanyaan saya. Saya melihat garis gema tetapi shopttidak menunjukkannya sebagai mati. Mungkin hanya ada beberapa pengaturan server aneh yang mencegah ini, saya tidak tahu. Saya mendapat solusi
Matt
mungkin .bashrcfile itu tidak bersumber secara default.
Daniel Farrell
8

Shell yang Anda dapatkan ketika Anda menjalankan perintah jarak jauh dengan SSH bukanlah shell interaktif atau shell login:

$ ssh server 'bash -c "echo $-"'
chsB

(tidak ada idan tidak ada ldalam tanggapan)

Dalam kasus Bash itu berarti tidak ada file inisialisasi biasa yang dibaca.

Anda dapat memaksa remote shell menjadi shell login dengan menambahkan -lke doa Bash Anda, yang berarti bahwa itu akan mengurai yang pertama dari ~/.bash_profile, ~/.bash_login, dan ~/.profilebahwa hal itu dapat menemukan, mencari agar, tapi tidak ~/.bashrc. Ini berarti Anda harus meletakkan alias di salah satu file itu.

Kusalananda
sumber
Ini terdengar seperti solusinya. Saya bahkan tidak menggunakan server ini lagi jadi saya tidak bisa mengujinya, tetapi mungkin layak untuk membatalkan ini jika ada orang lain yang menemukan pertanyaan.
Matt
2

Saya memiliki masalah yang sama, dan pada awalnya shopt -s expand_aliasessepertinya tidak membantu. Yang saya temukan adalah bahwa opsi ini harus ditetapkan sebelum menambahkan alias yang sebenarnya. Jadi jika alias diciptakan sebelum Anda .bashrcset pada expand_aliasespilihan, mereka tidak akan tersedia. Karena itu, Anda harus memuat (atau memuat ulang) alias setelah mengatur opsi.

Gene Pavlovsky
sumber
0

bash (1) mengatakan

...

Ketika shell interaktif yang bukan shell login dimulai, bash membaca dan mengeksekusi perintah dari ~ / .bashrc, jika file itu ada.

...

Shell interaktif adalah yang dimulai tanpa argumen non-opsi dan tanpa opsi -c yang input dan kesalahan standar keduanya terhubung ke terminal (sebagaimana ditentukan oleh isatty (3)), atau yang dimulai dengan opsi -i.

jadi, tentu saja, Anda sumber .bashrc secara manual atau jalankan dengan -i

jika alias yang Anda butuhkan, saya akan merekomendasikan membaginya dalam mis. alias dan kemudian sumber itu dari .bashrc dan skrip Anda, untuk berjaga-jaga jika hal-hal merayap di .bashrc yang dapat merusak skrip Anda, seperti yang sering terjadi

Aleksandar Ivanisevic
sumber
jadi saya melihat bahwa .bashrc sedang bersumber. Saya melihat garis gema dari .bashrc ketika saya menjalankan perintah. Masalahnya adalah alias dalam file itu tidak berkembang.
Matt
0

Anda dapat memecahkan masalah apa pun dengan memasukkan:

if [ -f /etc/skel/.bashrc ]; then . /etc/skel/.bashrc; fi

di baris pertama.

Riccardo La Marca
sumber