ฉันจะสร้างนามแฝงถาวรของ Bash ได้อย่างไร


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." ทำไมขั้นตอนนี้จึงจำเป็น
Geek

5
สิ่งแรกคืออะไร '.' ทำใน ~ / .bashrc?
Zen

22
@Geek @Zen "Execute" ไม่ใช่คำที่ถูกต้อง sourceจุดเทียบเท่ากับ ด้วย. ~/.bashrcคุณมาทุบตีของคุณ การเรียกใช้ไฟล์จะเริ่มต้นกระบวนการลูกดำเนินการคำสั่งในกระบวนการนี้แล้วส่งคืน ทุกสิ่งที่ทำในกระบวนการลูกไม่มีผลกับกระบวนการหลัก (การทุบตีที่คุณเรียกใช้) แต่การจัดหา (ด้วยจุด) จะทำหน้าที่เหมือนกับว่าคุณเขียนเนื้อหาของไฟล์ในเทอร์มินัล นี่คือสิ่งที่คุณต้องการ .bashrcมีที่มาทุกครั้งที่คุณเริ่มทุบตี หากคุณทำการเปลี่ยนแปลงพวกเขาจะไม่นำไปใช้จนกว่าคุณจะเริ่มทุบตีหรือแหล่งข้อมูลใหม่ด้วยตนเอง
Gauthier

@ButtleButkus - อาจต้องการเปลี่ยนการตั้งค่าของผู้ใช้เพียงคนเดียวมากกว่าทั้งระบบ ใน Ubuntu ไฟล์. bashrc ทั่วทั้งระบบคือ /etc/bash.bashrc
WillC

1
@ShubhamA ดูคำถามนี้สำหรับพฤติกรรม OSX
jandersen

253

มีหลายวิธีในการสร้างนามแฝง วิธีที่ใช้มากที่สุดคือ:

  1. เพิ่มนามแฝงใน~/.bashrcไฟล์ของคุณโดยตรง

    ตัวอย่างเช่น: ผนวกบรรทัดเหล่านี้ไปยัง~/.bashrcไฟล์

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

    ครั้งต่อไป (หลังจากที่คุณได้ออกจากระบบ / หรือทำ. ~/.bashrc) เมื่อคุณพิมพ์คำสั่งจะถูกดำเนินการrmrm -i

  2. วิธีที่สองช่วยให้คุณสร้างไฟล์นามแฝงแยกดังนั้นคุณจะไม่ต้องใส่มันเข้าไป.bashrcแต่เป็นไฟล์ที่คุณเลือก ก่อนอื่นให้แก้ไข~/.bashrcไฟล์ของคุณและเพิ่มบรรทัดต่อไปนี้หากยังไม่มีไฟล์หรือยกเลิกการใส่เครื่องหมายข้อคิดเห็นหากมี:

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

    บันทึกและปิดไฟล์ หลังจากนั้นสิ่งที่คุณต้องทำคือสร้าง~/.bash_aliasesไฟล์และเพิ่มชื่อแทนของคุณที่นั่นด้วยรูปแบบเดียวกับที่ระบุในวิธีแรก

    เนื้อหาของ~/.bash_aliasesไฟล์ของฉัน:

    alias cs='cd;ls'

71
+1 ~/.bash_aliasesสำหรับใช้
ændrük

ใช่การใช้ไฟล์อื่นสำหรับนามแฝงนั้นสะอาดกว่ามากและยังพกพาได้ระหว่าง distros ฉันจะใช้ไฟล์นั้นเพราะบางนามแฝงไม่เพียงพอและจำเป็นต้องใช้ฟังก์ชั่น ดังนั้นจึงสะอาดกว่าถ้าคุณใช้ไฟล์สำหรับงานนั้นแทน ฉันมีนามแฝงอื่น -> alias aliases="xdg-open ~/.bash_aliases && source ~/.bash_aliases"ดังนั้นนามแฝงก็มีประโยชน์ในการออมและถ้าคุณทำผิดพลาดมันจะโฆษณาคุณ
erm3nda

หลังจากที่ฉันเพิ่มนามแฝงเช่นalias ls='ls -althr'บางส่วนของธงที่กำหนดจะไม่มีผลบังคับใช้ในกรณีนี้แฟล็ก -t จะไม่มีผล คุณรู้ไหมว่าทำไม?
Sajuuk

3
ตามค่าเริ่มต้นจะ~/.bashrcมีการรวมไว้สำหรับ~/.bash_aliasesไม่จำเป็นต้องแก้ไข
Jaakko

1
ไม่เสมอ ~ / .bashrc มีการรวมสำหรับ ~ / .bash_aliases เหมือนในกรณีของฉันกับ Ubuntu terminal Windows 10 การแก้ปัญหานี้มีประโยชน์มาก
Jose

19

ฟังดูเหมือนว่าปัญหาเดียวของคุณคือพยายามรัน. bashrc เมื่อไม่สามารถใช้งานได้ แต่นี่ไม่ใช่วิธีที่ถูกต้องที่จะทำ เมื่อใดก็ตามที่คุณทำการเปลี่ยนแปลงกับไฟล์นี้คุณควร "execute" โดยคำสั่ง:

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

4
เพียงเพื่อความสมบูรณ์: จุดเริ่มต้นในบรรทัดที่มีความหมายเช่นเดียวกับเปลือกในตัวคำสั่ง. ~/.bash_aliases sourceฉันคิดว่านี่เป็นคำตอบที่ถูกต้องอธิบายว่าเกิดอะไรขึ้น
Melebius

17

ปัญหาคือคุณพยายามที่จะใช้งานไฟล์ที่ไม่สามารถเรียกใช้งานได้: คุณสามารถตรวจสอบกับ:

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

หมายเหตุไม่มีตัวอักษร "x - executable" ในคอลัมน์แรก (สิทธิ์ของไฟล์)

ไฟล์โปรไฟล์ไม่ใช่ไฟล์ที่ใช้งานได้แทนที่จะทำการเรียกใช้งานคุณโหลดด้วย:

source /home/bakhtiyor/.bashrc

หรือ

. /home/bakhtiyor/.bashrc

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

นี่คือตัวอย่างที่ฉันกำลังมองหาวิธีพิมพ์ตัวอักษรสองสามตัวที่เทอร์มินัล ("vps") เพื่อเข้าสู่เซิร์ฟเวอร์จากระยะไกลและเปิดใช้งานการส่งต่อ X11 เพื่อให้ฉันสามารถเรียกใช้แอป gui เช่น "gedit" ผ่านเครือข่าย

ไม่ว่าคำสั่ง / นามแฝงด้วยวิธีนี้ด้วยคำสั่ง echo เครื่องหมายอัญประกาศและสัญลักษณ์สำหรับต่อท้ายเอาต์พุตของคำสั่งไปยังไฟล์ (>>) ใช้งานได้สำหรับฉัน เพียงแค่แทนที่คำสั่งของฉันสำหรับคำสั่งนามแฝงที่คุณต้องการและป้อนลงใน terminal ของคุณ


ข้อความที่นี่ค่อนข้างยุ่งยาก ในตัวอย่างนี้การใช้เครื่องหมายคำพูดคู่ไม่มีความหมาย แต่ถ้าข้อความภายในเครื่องหมายคำพูดนั้นประกอบด้วยเครื่องหมายดอลลาร์เครื่องหมายแบ็กสแลช ฯลฯ คุณจะต้องเข้าใจว่าเชลล์ประมวลผลอย่างไรในเครื่องหมายคำพูดคู่ คุณสามารถเปลี่ยนเป็นอัญประกาศเดี่ยวได้ทั้งในและนอกอัญประกาศ แต่คุณยังต้องเข้าใจว่า Bash ประมวลผลอัญประกาศคู่ได้อย่างไรในคำจำกัดความของนามแฝง
tripleee

5

หากคุณใช้ทับทิมคุณสามารถติดตั้ง aka โดยใช้ rubygem

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

rubygem จะจัดหาไฟล์ dot ของคุณโดยอัตโนมัติเพื่อให้คุณไม่จำเป็นต้องใช้ ลองดูสิ


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

นี่คือจุดที่ถูกต้อง คุณมีวิธีแก้ปัญหาที่แนะนำคุณยินดีที่จะแบ่งปัน @ Troublemaker-DV หรือไม่?
blizzrdof77

ไม่แน่ใจว่ามันยังคงเกิดขึ้นจริง 2 1 / 2yo ในภายหลัง แต่ ... ในวันที่ 1 ฉันจะ grep RC สำหรับคำสั่ง alias เพื่อตรวจสอบว่านามแฝงนี้ถูกป้อนไว้แล้วเพื่อหลีกเลี่ยงการซ้ำซ้อน การตรวจสอบว่ามีนามแฝงอยู่ไม่เพียงพอเนื่องจาก RC อาจ "ปนเปื้อน" แล้วด้วยชื่อแทนหลายชื่อ
ปัญหา -DV

0

ฉันอยากจะแนะนำให้ใช้ /etc/bash.bashrc

คุณสามารถเพิ่มบรรทัดที่ท้ายไฟล์นั้น

alias ok="ping google.com"

หลังจากใส่นามแฝงต่อบรรทัดคุณต้องรีบูตหรือ relogin


7
"ฉันอยากจะแนะนำ .. " และทำไมคุณถึงแนะนำเช่นนั้น?
muru

2
คุณไม่ควรล้อเล่นกับไฟล์ระบบเว้นแต่คุณต้องการติดตั้งการตั้งค่าทั้งระบบสำหรับผู้ใช้ทั้งหมด ในระบบส่วนบุคคลความแตกต่างนั้นมีเพียงเล็กน้อย แต่จากนั้นการยุ่งกับไฟล์ระบบจะซับซ้อนกว่าเดิมดังนั้นคุณควรจะยังคงต้องการไฟล์ดอทส่วนตัวของคุณสำหรับการตั้งค่าส่วนตัว (และทำให้ง่ายต่อการคัดลอกการตั้งค่าที่อื่นใน อนาคตด้วย)
tripleee

1
Reboot? นั่นเป็นคำแนะนำที่แย่มาก ๆ อย่าทำอย่างนั้นโดยเฉพาะเมื่อsource /etc/bash.bashrcคุณต้องการทั้งหมดในตัวอย่างนี้ แต่ควรใช้~/.bashrcหรือ~/.bash_aliasesแทน
Xen2050

@ Xen2050 ฉันแนะนำให้รีบูตเพื่อแสดงว่าทำงานได้หลังจากรีบูต / relogin ยังไงก็ตามแม้แต่หน้าต่างเทอร์มินัลที่สะอาดก็ยังใช้งานได้
Fahad Ahammed

1
คุณสามารถอัปเกรดเป็นเคอร์เนลใหม่โดยไม่ต้องรีบูตเครื่องนี่ไม่ใช่หน้าต่างเก่า ;-)
Xen2050

0

ในขณะที่ฉันจำbashrcได้ว่ามีหรือมีเส้นแนะนำให้ไม่ใช้แทนนามแฝงโดยตรง วิธีการแก้ปัญหาคือการใช้แฟ้มภายนอก (s) fooและbarนามแฝงได้รับการเพิ่ม แต่จะเพิ่มไฟล์ต้องมี "ที่มา" (หรือเพียงแค่เปิดสถานีใหม่) ตัวอย่างเช่น: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นามแฝงทำงาน ฉันเพิ่งรู้ว่าคำตอบก่อนหน้านี้ได้กล่าวถึงเทคนิคนี้ แต่พวกเขาได้ฝัง lede

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.