गैर-संवादात्मक शेल उर्फ ​​का विस्तार करता है


12

जब मैं एक कमांड चलाता हूं तो मुझे अपने होस्टिंग खाते पर विस्तार करने के लिए एलियंस होने में परेशानी हो रही है:

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

मेरी .bashrc फ़ाइल है:

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"

जब मैं ऊपर ssh कमांड चलाता हूं, तो मैं ".bashrc" गूँजता हूं। लेकिन अगर मैं उपनाम चलाने की कोशिश करता हूं, तो मुझे कुछ नहीं मिलता है।

मैं "बैश -ic" की कोशिश कर सकता था, लेकिन यह वास्तव में एक स्क्रिप्ट में है जिसे मैं आसानी से नहीं बदल सकता, और मैं जानना चाहता हूं कि यह काम क्यों नहीं कर रहा है।

का आउटपुट 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

का आउटपुट ssh user@server "bash -c \"echo $SHELL\""

.bashrc
/bin/bash

मैंने हार मान ली है और ~ ~ बिन में सिम्बलिंक और स्क्रिप्ट बनाई है, वही काम जो मैं एलियासेस के साथ करना चाहता था। जब तक मैं अपने निर्यात करता हूं $PATHजब तक ~/bin:$PATHयह अच्छी तरह से काम करता है।
मैट

Ubuntu (16.04 और नए यकीन है कि के लिए) यदि आप एक है पर ~/.local/binजब /etc/profileसंसाधित किया जाता है तो यह अपने आप पथ है कि जोड़ देगा। आप . /etc/profileरिबूट या लॉगआउट / लॉगिन के बिना अपने PATH में शामिल होने के लिए फ़ोल्डर बनाने के बाद भी कर सकते हैं ।
ड्रैगन 88 --88

जवाबों:


15

से bash(1)आदमी पेज:

जब शेल इंटरएक्टिव नहीं होता है, तब तक एलियासेस का विस्तार नहीं किया जाता है, जब तक कि एक्सप्लोसिअलीस शेल विकल्प शॉप्ट का उपयोग करके सेट नहीं किया जाता है (नीचे शेल बिल्डिन के तहत शॉप का वर्णन देखें)।


5
मेरे पास shopt -s expand_aliasesमेरे .bashrc में है, लेकिन वह काम नहीं करता है। मुझे यकीन नहीं है कि क्यों नहीं, लेकिन मुझे लगता है कि यह उत्तर सामान्य रूप से होगा
मैट

@ मैट मुझे 'घटनाओं' के आदेश पर यकीन नहीं है, लेकिन क्या आपने यह सुनिश्चित करने की कोशिश की shopt -s expand_aliasesहै .bashrcकि एलियास से पहले आप में है? निश्चित रूप से, सवाल शो में आपका आउटपुट expand_aliasesहै off
क्रिमसन-एग्रेट

हाँ, मेरे प्रश्न में .bashrc देखें। मैं इको लाइन देखता हूं, लेकिन shoptइसे दिखावा करता है। शायद कुछ अजीब सर्वर सेटिंग है जो इसे रोक रही है, मुझे नहीं पता। मुझे एक वर्कअराउंड मिल गया है
मैट

शायद .bashrcफ़ाइल डिफ़ॉल्ट रूप से सॉर नहीं की जा रही थी।
डैनियल फैरेल

8

जब आप SSH के साथ दूरस्थ रूप से एक कमांड निष्पादित करते हैं तो आपको जो शेल मिलता है वह न तो एक इंटरेक्टिव शेल है और न ही एक लॉगिन शेल:

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

( प्रतिक्रिया में कोई iऔर नहीं l)

बैश के मामले में इसका मतलब है कि सामान्य आरंभीकरण फ़ाइलों में से कोई भी पढ़ा नहीं जाता है।

आप दूरस्थ खोल जोड़कर एक लॉगिन खोल होने के लिए मजबूर कर सकते हैं -lअपने बैश मंगलाचरण के लिए, जिसका अर्थ है कि इसके बारे में पहले एक पार्स हैं ~/.bash_profile, ~/.bash_login, और ~/.profile, इसे पा सकते हैं कि इसी क्रम में खोज, लेकिन नहीं ~/.bashrc। इसका मतलब है कि आपको अपने उपनाम को उन फाइलों में से एक में रखना होगा।


यह समाधान की तरह लगता है। मैं भी इस सर्वर का उपयोग नहीं कर रहा हूं इसलिए मैं इसका परीक्षण नहीं कर सकता, लेकिन संभवत: इस मामले में कोई और सवाल उठाता है।
मैट

2

मैं एक ही समस्या थी, और पहली बार में shopt -s expand_aliasesमदद करने के लिए प्रतीत नहीं किया था। मुझे पता चला है कि वास्तविक उपनाम जोड़ने से पहले यह विकल्प निर्धारित किया जाना चाहिए। इसलिए यदि आपके विकल्प .bashrcसेट करने से पहले उपनाम बनाए जाते हैं expand_aliases, तो वे उपलब्ध नहीं होंगे। इसलिए, आपको विकल्प सेट करने के बाद उपनाम लोड (या पुनः लोड करना) करना चाहिए।


0

bash (1) कहता है

...

जब एक इंटरेक्टिव शेल जो लॉगिन शेल नहीं है, तो bash पढ़ता है और ~ / .bashrc से कमांड निष्पादित करता है, अगर यह फाइल मौजूद है।

...

एक इंटरेक्टिव शेल एक गैर-विकल्प तर्क के बिना शुरू किया गया है और -सी विकल्प के बिना जिसका मानक इनपुट और त्रुटि दोनों टर्मिनलों से जुड़े हुए हैं (जैसा कि आइसट्टी (3) द्वारा निर्धारित किया गया है), या एक -i विकल्प के साथ शुरू हुआ।

तो, जाहिर है, आप या तो स्रोत .bashrc मैन्युअल या इसे -i के साथ चलाते हैं

अगर उपनाम आप सभी की जरूरत है, तो मैं उन्हें अलग करने की सलाह दूंगा। उदाहरण के तौर पर .aliases और उसके बाद स्रोत। दोनों से .bashrc और आपकी स्क्रिप्ट, बस मामले में सामान। cashps में आपकी स्क्रिप्ट को तोड़ सकता है, जैसा कि अक्सर होता है।


इसलिए मैं देख रहा हूं कि .bashrc को सोर्स किया जा रहा है। जब मैं कमांड चलाता हूं, तो .bashrc से इको लाइन देखता हूं। समस्या यह है कि फ़ाइल में उपनाम का विस्तार नहीं है।
मैट

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.