Bí danh mở rộng vỏ không tương tác


12

Tôi gặp sự cố khi có bí danh để mở rộng trên tài khoản lưu trữ của mình khi tôi chạy một lệnh như:

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

Tệp .bashrc của tôi là:

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"

Khi tôi chạy lệnh ssh ở trên, tôi thấy ".bashrc" echo'd. Nhưng nếu tôi cố chạy bí danh, tôi chẳng nhận được gì.

Tôi có thể thử "bash -ic", nhưng đây thực sự là một kịch bản mà tôi không thể dễ dàng thay đổi và tôi muốn biết tại sao điều này không hiệu quả.

Đầu ra của 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

Đầu ra của ssh user@server "bash -c \"echo $SHELL\""

.bashrc
/bin/bash

Tôi đã từ bỏ và chỉ tạo các liên kết tượng trưng và tập lệnh trong ~ / bin làm điều tương tự tôi muốn với bí danh. Miễn là tôi xuất khẩu của tôi $PATH~/bin:$PATHnó hoạt động tốt.
Matt

Trên Ubuntu (chắc chắn 16.04 và mới hơn) nếu bạn có ~/.local/binthời gian /etc/profileđược xử lý, nó sẽ tự động thêm nó vào PATH của bạn. Bạn cũng có thể ngay . /etc/profilesau khi tạo thư mục để thêm nó vào PATH của mình mà không cần khởi động lại hoặc đăng xuất / đăng nhập.
dragon788

Câu trả lời:


15

Từ bash(1)trang người đàn ông:

Các bí danh không được mở rộng khi shell không tương tác, trừ khi tùy chọn shell extend_aliases được đặt bằng shopt (xem mô tả về shopt trong SHELL BUILTIN THÔNG TIN bên dưới).


5
Tôi có shopt -s expand_aliasestrong .bashrc của tôi, nhưng điều đó dường như không hoạt động. Tôi không chắc tại sao không, nhưng tôi đoán đây sẽ là câu trả lời bình thường
Matt

@Matt Tôi không chắc thứ tự của 'sự kiện', nhưng bạn đã thử đảm bảo rằng shopt -s expand_aliasesnó nằm trong .bashrcbí danh của bạn chưa? Chắc chắn, đầu ra của bạn trong câu hỏi cho thấy expand_aliasesoff.
đỏ thẫm-egret

Vâng, hãy xem .bashrc trong câu hỏi của tôi. Tôi thấy dòng echo nhưng shoptkhông hiển thị. Có lẽ chỉ có một số cài đặt máy chủ kỳ lạ ngăn cản điều này, tôi không biết. Tôi đã có một cách giải quyết
Matt

có lẽ .bashrctập tin không được lấy theo mặc định.
Daniel Farrell

8

Shell mà bạn nhận được khi thực hiện lệnh từ xa bằng SSH không phải là shell tương tác cũng không phải là shell đăng nhập:

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

(không có ivà không có ltrong phản hồi)

Trong trường hợp của Bash, điều đó có nghĩa là không có tệp khởi tạo thông thường nào được đọc.

Bạn có thể buộc các remote shell là một vỏ đăng nhập bằng cách thêm -lđể gọi Bash của bạn, có nghĩa là nó sẽ phân tích đầu tiên của ~/.bash_profile, ~/.bash_login~/.profilenó có thể tìm kiếm, tìm kiếm theo thứ tự đó, nhưng không phải ~/.bashrc. Điều này có nghĩa là bạn sẽ phải đặt bí danh của mình vào một trong những tệp đó.


Điều này nghe có vẻ như giải pháp. Tôi thậm chí không sử dụng máy chủ này nữa nên tôi không thể kiểm tra nó, nhưng có lẽ đáng để nâng cao điều này trong trường hợp người khác tìm thấy câu hỏi.
Matt

2

Tôi có cùng một vấn đề, và lúc đầu shopt -s expand_aliasesdường như không giúp được gì. Những gì tôi đã phát hiện ra là các tùy chọn này nên được đặt trước khi thêm các bí danh thực tế. Vì vậy, nếu bí danh được tạo trước khi bạn .bashrcđặt các expand_aliasestùy chọn, chúng sẽ không khả dụng. Do đó, bạn nên tải (hoặc tải lại) bí danh sau khi đặt tùy chọn.


0

bash (1) nói

...

Khi một vỏ tương tác không phải là vỏ đăng nhập được khởi động, bash đọc và thực thi các lệnh từ ~ / .bashrc, nếu tệp đó tồn tại.

...

Một vỏ tương tác được bắt đầu mà không có đối số không phải tùy chọn và không có tùy chọn -c có đầu vào và lỗi tiêu chuẩn đều được kết nối với các thiết bị đầu cuối (như được xác định bởi isatty (3)) hoặc bắt đầu bằng tùy chọn -i.

vì vậy, rõ ràng, bạn hoặc nguồn .bashrc theo cách thủ công hoặc chạy nó với -i

nếu bí danh là tất cả những gì bạn cần, tôi khuyên bạn nên tách chúng ra trong ví dụ .aliases và sau đó lấy nguồn từ cả .bashrc và tập lệnh của bạn, chỉ trong trường hợp công cụ xuất hiện trong .bashrc có thể phá vỡ tập lệnh của bạn, vì nó thường xảy ra


vì vậy tôi thấy rằng .bashrc đang được cung cấp. Tôi thấy dòng echo từ .bashrc khi tôi chạy lệnh. Vấn đề là bí danh trong tập tin đó không mở rộng.
Matt

0

Bạn có thể giải quyết bất kỳ vấn đề bằng cách nhập:

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

ở dòng đầu tiên.

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.