मैं एक स्थायी बैश उपनाम कैसे बनाऊं?


381

मैं rmइस आदेश को निष्पादित करने के बाद एक पुष्टिकरण संदेश देने के लिए एक उपनाम बनाना चाहता हूं । तो मैं इस तरह से एक उपनाम बना रहा हूं alias rm='rm -i'। लेकिन जहां तक ​​मुझे पता है कि यह एक अस्थायी उपनाम है और यह तब तक रहता है जब तक आप टर्मिनल बंद नहीं करते।

जैसा कि यहाँ बताया गया है कि उपनाम को स्थायी रूप से बचाने के लिए मुझे टर्मिनल में निष्पादित ~/.bash_aliasesया ~/.bashrcकमांड करने और अपने उपनाम को वहां जोड़ने की आवश्यकता है। लेकिन जब मैं निष्पादित करता ~/.bashrcहूं तो मुझे निम्नलिखित त्रुटि संदेश मिलता है:

bash: /home/bakhtiyor/.bashrc: Permission denied

जब मैं दौड़ता ~/.bash_aliasesहूं तो मुझे एक और त्रुटि संदेश मिलता है:

bash: /home/bakhtiyor/.bash_aliases: File or directory doesn't exist.

वास्तविक समस्या क्या है और मैं इसे कैसे हल कर सकता हूं?



alias rm='rm -i'rm haphazardly
qwr

जवाबों:


428

एक उपनाम बनाने के लिए स्थायी रूप से अपनी .bashrcफ़ाइल में उपनाम जोड़ें

gedit ~/.bashrc

और फिर सबसे नीचे अपना उपनाम जोड़ें।

वैकल्पिक शब्द

अब . ~/.bashrcअपने टर्मिनल में निष्पादित करें ( .और के बीच एक स्थान होना चाहिए ~/.bashrc

अब आप अपने उपनाम की जाँच कर सकते हैं।

वैकल्पिक शब्द


5
। @ karthick87 आप लिखा था "।।। अब अमल ~ अपने टर्मिनल में / .bashrc (के बीच एक अंतर होना चाहिए और ~ / .bashrc" क्यों इस कदम की जरूरत है?
गीक

5
पहला क्या है? ' में करते हैं। ~ / .बशस्क?
झेन

22
@ Geek @Zen "Execute" सही शब्द नहीं था। डॉट के बराबर है source। के साथ . ~/.bashrc, आप अपने बैश स्रोत। फ़ाइल को निष्पादित करने से एक बच्चे की प्रक्रिया शुरू होगी, इस प्रक्रिया में कमांड निष्पादित करें, फिर वापस लौटें। बच्चे की प्रक्रिया में जो कुछ भी किया जाता है उसका मूल प्रक्रिया पर कोई प्रभाव नहीं पड़ता है (वह बैश जिससे आपने निष्पादित किया था)। इसके बजाय, सोर्सिंग (डॉट के साथ) ठीक उसी तरह से कार्य करता है जैसे आपने टर्मिनल में फ़ाइल की सामग्री को लिखा था। ये वो है जो तुम चाहते हो। .bashrcहर बार जब आप एक बैश शुरू करते हैं। यदि आप परिवर्तन करते हैं, तो वे तब तक लागू नहीं होंगे जब तक आप मैन्युअल रूप से एक नया बैश या स्रोत शुरू नहीं करते।
गौथियर

@ButtleButkus - पूरे सिस्टम के बजाय केवल एक उपयोगकर्ता की वरीयताओं को बदलना चाह सकता है। उबंटू में सिस्टम-वाइड .bashrc फ़ाइल /etc/bash.bashrc
WillC

1
@ShubhamA। इस सवाल को OSX व्यवहार के लिए देखें
jandersen

253

उपनाम बनाने के कई तरीके हैं। सबसे अधिक इस्तेमाल किया तरीके हैं:

  1. अपनी ~/.bashrcफ़ाइल में सीधे उपनाम जोड़ें

    उदाहरण के लिए: ~/.bashrcफाइल करने के लिए इन लाइन को जोड़ें

    alias ll='ls -l'
    alias rm='rm -i'

    अगली बार (जब आप लॉग आउट / इन, या कर चुके हों . ~/.bashrc) जब आप टाइप करेंगे rmतो rm -iकमांड निष्पादित हो जाएगी।

  2. दूसरी विधि आपको एक अलग उपनाम फ़ाइल बनाने देती है, इसलिए आपको उन्हें .bashrcअपनी पसंद की फ़ाइल में नहीं रखना होगा । सबसे पहले, अपनी ~/.bashrcफ़ाइल को संपादित करें और यदि वे पहले से मौजूद नहीं हैं, तो निम्न पंक्तियों को जोड़ें या यदि वे ऐसा करते हैं तो उन्हें अनलॉक्ड करें:

    if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
    fi

    इसे सहेजें और फ़ाइल को बंद करें। उसके बाद, आपको बस एक ~/.bash_aliasesफ़ाइल बनानी होगी और अपने उपनामों को वहां जोड़ना होगा, जिसमें पहले विधि में एक ही प्रारूप निर्दिष्ट है।

    मेरी ~/.bash_aliasesफ़ाइल की सामग्री :

    alias cs='cd;ls'

71
उपयोग करने के लिए +1 ~/.bash_aliases
æंड्रिज

हां, उपनाम के लिए एक और फ़ाइल का उपयोग करना बहुत अधिक साफ है, डिस्ट्रोस के बीच भी पोर्टेबल है। मैं उस फ़ाइल का उपयोग इसलिए करता हूं क्योंकि कुछ उपनाम पर्याप्त नहीं हैं और एक फ़ंक्शन की आवश्यकता है। यदि आप इसके बजाय उस कार्य के लिए किसी फ़ाइल का उपयोग करते हैं तो यह अधिक साफ है। मेरे पास एक और उपनाम है -> alias aliases="xdg-open ~/.bash_aliases && source ~/.bash_aliases", इसलिए बचत करने पर अन्य लोग लाभान्वित हो गए, और यदि आप कुछ गलती करते हैं तो यह आपका विज्ञापन करेगा।
erm3nda

किसी तरह मैंने उर्फ ​​को जोड़ दिया जैसे कि alias ls='ls -althr', दिए गए कुछ झंडे प्रभावी नहीं होंगे, इस मामले में -t झंडा प्रभावी नहीं था। तुम जानते हो क्यों?
सजुक

3
डिफ़ॉल्ट रूप से ~/.bashrcइसमें शामिल करने के लिए ~/.bash_aliases, इसे संपादित करने की आवश्यकता नहीं है।
जाको

1
हमेशा नहीं / ~ .bashrc में ~ / .bash_aliases के लिए समावेश शामिल है क्योंकि उबंटू टर्मिनल विंडोज 10 के साथ मेरे मामले में यह समाधान बहुत काम आया।
जोस

19

यह मुझे लगता है कि आपकी एकमात्र समस्या बस निष्पादन की कोशिश कर रही है। लेकिन ऐसा करने का यह सही तरीका नहीं है; जब भी आप इस फ़ाइल में कोई बदलाव करते हैं, तो आपको इसे कमांड द्वारा "निष्पादित" करना चाहिए:

source ~/.bashrc

अन्यथा, यह बस एक नया शेल बनाएगा, फ़ाइल को नए शेल के वातावरण में निष्पादित करेगा, फिर उस वातावरण को छोड़ देगा जब यह बाहर निकल जाएगा, जिससे आपका परिवर्तन खो जाएगा। स्क्रिप्ट की सोर्सिंग करके, यह वर्तमान शेल के भीतर निष्पादित होता है, इसलिए यह प्रभावी रहेगा।

मैं दूसरी त्रुटि मान रहा हूँ क्योंकि bash_aliases मौजूद नहीं है। इसकी आवश्यकता नहीं है, बस अपने परिवर्तनों को अलग और व्यवस्थित रखने के लिए अनुशंसित है। इसका उपयोग केवल तभी होता है यदि यह मौजूद है, और आप इसके लिए परीक्षण को .bashrc में देख सकते हैं:

if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi

यह कहता है कि यदि फ़ाइल ~ / .bash_aliases मौजूद है, तो इसे चलाएं।


~/.bash_aliasesबेहतर है। askubuntu.com/questions/194111/…
tomByrer

1
sourceकमांड का उपयोग करने से मेरे उपनाम काम करते हैं। +1
dspacejs 10

4
पूर्णता के लिए: लाइन पर आरंभिक बिंदु . ~/.bash_aliasesका वही अर्थ होता है जो शेल में निर्मित कमांड का होता है source। मुझे यह सही उत्तर लगता है, यह बताते हुए कि क्या चल रहा है।
मेलेबियस

17

समस्या यह है कि आप एक गैर-निष्पादन योग्य फ़ाइल निष्पादित करने का प्रयास कर रहे हैं: आप इसके साथ जाँच कर सकते हैं:

ls -la ~/.bashrc
-rw-r--r-- 1 username username 3596 2010-08-05 17:17 /home/pt001424/.bashrc

ध्यान दें कि पहले कॉलम (फ़ाइल अनुमति) पर कोई "x - निष्पादन योग्य" अक्षर नहीं है।

प्रोफ़ाइल फ़ाइलें निष्पादन योग्य फ़ाइलें नहीं हैं, उन्हें निष्पादित करने के बजाय आप उन्हें लोड करते हैं:

source /home/bakhtiyor/.bashrc

या

. /home/bakhtiyor/.bashrc

7
echo "alias vps='ssh -X user@example.com'" >> ~/.bashrc

यह एक उदाहरण है जिसकी मुझे तलाश थी, एक सर्वर में दूरस्थ रूप से लॉग इन करने के लिए टर्मिनल ("वीपीएस") पर कुछ अक्षरों को टाइप करने और एक्स 11 को अग्रेषित करने में सक्षम करने के लिए ताकि मैं नेटवर्क पर "जीडिट" जैसे गुई ऐप चला सकूं।

कमांड / अलियासेड कमांड जो भी हो, इस तरह से इको स्टेटमेंट, कोटेशन मार्क्स, और कमांड के आउटपुट को फाइल (>>) में जोड़ने के लिए प्रतीक मेरे लिए काम करता है। बस आप की जरूरत के उपनाम आदेश के लिए मेरे आदेश को बदलें और इसे अपने टर्मिनल में दर्ज करें।


यहाँ उद्धृत करना थोड़ा मुश्किल है। इस उदाहरण में, दोहरे उद्धरण चिह्नों का उपयोग करना अप्रमाणिक है, लेकिन यदि उद्धरणों के भीतर पाठ में डॉलर के संकेत, बैकस्लैश आदि शामिल हैं, तो आपको यह समझने की आवश्यकता होगी कि शेल दोहरे उद्धरण चिह्नों के अंदर उन्हें कैसे संसाधित करता है। आप बाहर की तरफ सिंगल कोट्स और अंदर के डबल कोट्स पर स्विच कर सकते हैं, लेकिन फिर भी आपको यह समझने की जरूरत है कि बैश अलियास परिभाषा में डबल कोट्स को कैसे प्रोसेस करता है।
ट्रिपलए

5

यदि आप माणिक का उपयोग कर रहे हैं, तो आप रूबीम का उपयोग करके उर्फ ​​स्थापित कर सकते हैं।

gem install aka2

प्रयोग

aka generate hello="echo helloworld" #add an alias
aka g hello="echo helloworld"  #add alias for lazy people

aka destroy hello #remove alias
aka d hello #remove alias for lazy people

रूबीम आपकी डॉट फाइल को ऑटो-सोर्स करेगा ताकि आपको इसकी जरूरत न पड़े। इसकी जांच - पड़ताल करें।


4

मैंने जल्दी से एक नया उपनाम बनाने के लिए यह सहायक फ़ंक्शन लिखा था, और फिर ~/.bash_aliases (यदि यह मौजूद है) या तो उपनाम की परिभाषा लिखें ~/.bashrc

सुझाव : सुनिश्चित करें कि ~/.bash_aliasesमौजूद है और में निष्पादित है ~/.bashrc

# -----------------------------------
#  Create a new permanent bash alias
#
#  @param $1 - name
#  @param $2 - definition
# -----------------------------------
new-alias () { 
  if [ -z "$1" ]; then
    echo "alias name:" && read NAME
  else
    NAME=$1
  fi

  if alias $NAME 2 > /dev/null > /dev/null; then
    echo "alias $NAME already exists - continue [y/n]?" && read YN
    case $YN in
      [Yy]* ) echo "okay, let's proceed.";;
      [Nn]* ) return;;
      * ) echo "invalid response." && return;;
    esac
  fi

  if [ -z "$2" ]; then
    echo "alias definition:" && read DEFINTION
  else
    DEFINTION="$2"
  fi

  if [ -f ~/.bash_aliases ]; then
    echo "alias $NAME=\"$DEFINTION\"" >> ~/.bash_aliases
  else
    echo "alias $NAME=\"$DEFINTION\"" >> ~/.bashrc
  fi

  alias $NAME="$DEFINTION"
}

1
अच्छा विचार है, लेकिन इस फ़ंक्शन का उपयोग करने में लापरवाही .bashrcसे aliasकमांड के कई उदाहरणों के साथ ट्रसिंग हो सकती है । आपके कार्य को निश्चित रूप से ऐसी अव्यवस्था से बचने के लिए कुछ चेकअप को लागू करने की आवश्यकता है।
संकटमोचन- DV

यह एक मान्य बिंदु है। क्या आपके पास सुझाया गया वर्कअराउंड है जो आप @ ट्रबलमेकर-डीवी को साझा करने के इच्छुक हैं?
blizzrdof77

यदि यह अभी भी वास्तविक 2 1 / 2yo बाद में असुरक्षित है, लेकिन ... पहली बार में मैं जाँच करने के लिए उपनाम के लिए आरसी को आदेशित करूँगा, यदि यह उपनाम पहले से ही डुप्लिकेट से बचने के लिए वहां दर्ज किया गया था। एक उपनाम के अस्तित्व के लिए आपकी जांच पर्याप्त नहीं है, क्योंकि आरसी पहले से ही एक ही नाम के कई उपनामों के साथ "दूषित" हो सकता है।
संकटमोचन-डीवी

0

मैं उपयोग करने का सुझाव दूंगा /etc/bash.bashrc

आप उस फ़ाइल के अंत में लाइन जोड़ सकते हैं।

alias ok="ping google.com"

प्रति पंक्ति एलियंस को डालने के बाद आपको रिबूट या रिलोजिन करना होगा।


7
"मैं सुझाव दूंगा .." और आप ऐसा क्यों सुझाएंगे?
मुरु

2
जब तक आप विशेष रूप से सभी उपयोगकर्ताओं के लिए एक सिस्टम-वाइड सेटिंग स्थापित नहीं करना चाहते, आपको सिस्टम फ़ाइल के साथ खिलवाड़ नहीं करना चाहिए। एक व्यक्तिगत प्रणाली पर, अंतर मामूली है, लेकिन फिर सिस्टम फ़ाइलों के साथ खिलवाड़ करना सड़क के नीचे अधिक जटिल है, इसलिए आपको व्यक्तिगत वरीयताओं के लिए अपनी निजी डॉट फ़ाइलों को अभी भी पसंद करना चाहिए (और इससे सेटिंग्स को कहीं और कॉपी करना आसान हो जाता है) भविष्य भी)।
ट्रिपलए

1
रीबूट करें? यह वास्तव में भयानक सलाह है, ऐसा मत करो, खासकर जब source /etc/bash.bashrcआप इस उदाहरण में सभी चाहते हैं। लेकिन इसके बजाय ~/.bashrcया उपयोग करना चाहिए~/.bash_aliases
Xen2050

@ Xen2050, मैंने रिबूट का सुझाव दिया कि यह रिबूट / रिलगिन के बाद काम करने के लिए दिखाए। वैसे, एक और साफ टर्मिनल विंडो भी काम करेगी।
फहद अहमद

1
आप रिबूट किए बिना एक नए कर्नेल में अपग्रेड कर सकते हैं, यह पुरानी खिड़कियां नहीं है ;-)
Xen2050

0

जैसा कि मुझे याद है, bashrcहै, या है, एक पंक्ति जो इसे सीधे उपनामों के लिए उपयोग नहीं करने का सुझाव देती है। इसका समाधान बाहरी फ़ाइल (नों) का उपयोग करना है। fooऔर barउपनाम जोड़ दिया गया है, लेकिन जोड़ने के लिए फ़ाइल "sourced" किया जाना चाहिए (या, बस एक नया टर्मिनल खोलने के लिए)। उदाहरण के लिए:bazbashrc

thufir@dur:~$ 
thufir@dur:~$ alias
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
alias bar='echo foo'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias foo='echo foo'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
thufir@dur:~$ 
thufir@dur:~$ cat .bash_aliases 
alias foo='echo foo'
alias bar='echo foo'
alias baz='echo baz'

thufir@dur:~$ 
thufir@dur:~$ source .bashrc 
thufir@dur:~$ 
thufir@dur:~$ alias
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
alias bar='echo foo'
alias baz='echo baz'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias foo='echo foo'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
thufir@dur:~$ 
thufir@dur:~$ baz
baz
thufir@dur:~$ 

अब bazउर्फ काम करता है। मुझे केवल अभी पता चला है कि पिछले उत्तर ने इस तकनीक का उल्लेख किया था , लेकिन उन्होंने इसका नेतृत्व किया था।

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