Làm thế nào để tôi tạo một bí danh Bash vĩnh viễn?


382

Tôi muốn tạo một bí danh để ra rmlệnh để có một thông báo xác nhận sau khi thực hiện lệnh này. Vì vậy, tôi đang tạo ra một bí danh như thế này alias rm='rm -i'. Nhưng theo tôi biết đây là bí danh tạm thời và nó tồn tại cho đến khi bạn đóng thiết bị đầu cuối.

Như được giải thích ở đây để lưu bí danh vĩnh viễn, tôi cần thực thi ~/.bash_aliaseshoặc ~/.bashrcra lệnh trong terminal và thêm bí danh của mình vào đó. Nhưng khi tôi thực thi, ~/.bashrctôi nhận được thông báo lỗi sau:

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

Khi tôi chạy, ~/.bash_aliasestôi nhận được một thông báo lỗi như thế này:

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

Vấn đề thực tế là gì và làm thế nào tôi có thể giải quyết nó?



alias rm='rm -i'không giải quyết được vấn đề sử dụng rm haphazardly
qwr

Câu trả lời:


429

Để tạo bí danh vĩnh viễn, hãy thêm bí danh vào .bashrctệp của bạn

gedit ~/.bashrc

Và sau đó thêm bí danh của bạn ở phía dưới.

văn bản thay thế

Bây giờ thực hiện . ~/.bashrctrong thiết bị đầu cuối của bạn (nên có một khoảng cách giữa .~/.bashrc.

Bây giờ bạn có thể kiểm tra bí danh của bạn.

văn bản thay thế


5
@ karthick87 bạn đã viết "Bây giờ thực thi. ~ / .bashrc trong thiết bị đầu cuối của bạn (cần có một khoảng cách giữa. và ~ / .bashrc.". Tại sao bước này lại cần thiết?
Geek

5
cái đầu tiên '.' làm trong ~ / .bashrc?
Zen

22
@Geek @Zen "Thực thi" không phải là thuật ngữ chính xác. Dấu chấm tương đương với source. Với . ~/.bashrc, bạn nguồn bash của bạn. Thực thi tệp sẽ bắt đầu một tiến trình con, thực hiện các lệnh trong quy trình này, sau đó trả về. Tất cả những gì được thực hiện trong tiến trình con không ảnh hưởng đến tiến trình cha (bash mà bạn đã thực hiện). Thay vào đó, tìm nguồn cung ứng (có dấu chấm) hoạt động chính xác như thể bạn đã viết nội dung của tệp trong thiết bị đầu cuối. Đây là cái bạn muốn. .bashrccó nguồn gốc mỗi khi bạn bắt đầu bash. Nếu bạn thực hiện thay đổi, họ sẽ không áp dụng cho đến khi bạn bắt đầu một bash hoặc nguồn mới theo cách thủ công.
Gauthier

@BriptButkus - có thể muốn thay đổi chỉ một sở thích của người dùng thay vì toàn bộ hệ thống. Trong Ubuntu, tệp .bashrc trên toàn hệ thống là
/etc/bash.bashrc

1
@ShubhamA. xem câu hỏi này cho hành vi OSX
jandersen

253

Có rất nhiều cách để tạo bí danh. Các cách được sử dụng nhiều nhất là:

  1. Thêm bí danh trực tiếp trong ~/.bashrctập tin của bạn

    Ví dụ: nối các dòng này vào ~/.bashrctập tin

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

    Thời gian tới (sau khi bạn đã đăng nhập ra / vào, hoặc thực hiện . ~/.bashrc) khi bạn gõ rmcác rm -ilệnh sẽ được thực thi.

  2. Phương pháp thứ hai cho phép bạn tạo một tệp bí danh riêng biệt, do đó bạn sẽ không phải đặt chúng vào .bashrc, mà là một tệp bạn chọn. Đầu tiên, chỉnh sửa ~/.bashrctệp của bạn và thêm các dòng sau nếu chúng chưa tồn tại hoặc bỏ ghi chú nếu chúng thực hiện:

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

    Lưu nó và đóng tập tin. Sau đó, tất cả những gì bạn phải làm là tạo một ~/.bash_aliasestệp và thêm các bí danh của mình ở đó, với cùng định dạng được chỉ định trong phương thức đầu tiên.

    Nội dung ~/.bash_aliasestập tin của tôi :

    alias cs='cd;ls'

71
+1 để sử dụng ~/.bash_aliases.
ændrük

Đúng, sử dụng một tệp khác cho bí danh sạch sẽ hơn nhiều, cũng có thể di động giữa các bản phát hành. Tôi sử dụng tập tin đó vì một số bí danh là không đủ và cần có một chức năng. Vì vậy, nó sẽ sạch hơn nhiều nếu bạn sử dụng một tệp cho nhiệm vụ đó thay thế. Tôi có một bí danh khác -> alias aliases="xdg-open ~/.bash_aliases && source ~/.bash_aliases", vì vậy bí danh đã trở nên vô ích khi tiết kiệm và nếu bạn mắc một số sai lầm, nó sẽ quảng cáo cho bạn.
erm3nda

bằng cách nào đó sau khi tôi thêm bí danh như alias ls='ls -althr', một số các cờ nhất định sẽ không có hiệu lực, trong trường hợp này cờ -t không có hiệu lực. bạn có biết tại sao?
Sajuuk

3
Theo mặc định ~/.bashrccó chứa bao gồm ~/.bash_aliases, không cần chỉnh sửa nó.
Jaakko

1
Không phải lúc nào ~ / .bashrc chứa sự bao gồm cho ~ / .bash_aliases như trong trường hợp của tôi với thiết bị đầu cuối Ubuntu Windows 10, giải pháp này rất tiện dụng.
Jose

19

Đối với tôi có vẻ như vấn đề duy nhất của bạn chỉ đơn giản là cố gắng thực thi .bashrc khi không thể thực thi được. Nhưng đây không phải là cách chính xác để làm điều đó; Bất cứ khi nào bạn thực hiện thay đổi cho tệp này, bạn nên "thực thi" nó bằng lệnh:

source ~/.bashrc

Mặt khác, nó chỉ đơn giản là tạo một shell mới, thực thi tệp trong môi trường của shell mới, sau đó loại bỏ môi trường đó khi nó thoát, do đó làm mất thay đổi của bạn. Bằng cách tìm nguồn cung cấp tập lệnh, nó thực thi trong trình bao hiện tại, do đó nó sẽ vẫn có hiệu lực.

Tôi giả sử lỗi thứ hai là do bash_aliases không tồn tại. Không bắt buộc, chỉ nên giữ các thay đổi của bạn riêng biệt và có tổ chức. Nó chỉ được sử dụng nếu nó tồn tại và bạn có thể xem thử nghiệm cho nó trong .bashrc:

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

Điều này nói rằng nếu tệp ~ / .bash_aliases tồn tại, thì hãy chạy nó.


~/.bash_aliasestốt hơn. Askubfox.com/questions/194111/ Mạnh
tomByrer

1
sử dụng sourcelệnh làm cho bí danh của tôi hoạt động. +1
dspacejs

4
Chỉ để hoàn thiện: Dấu chấm ban đầu trên dòng . ~/.bash_aliasescó cùng ý nghĩa với lệnh tích hợp shell source. Tôi thấy đây là câu trả lời chính xác, giải thích những gì đang diễn ra.
Melebius

17

Vấn đề là bạn đang cố thực thi một tệp không thể thực thi: Bạn có thể kiểm tra điều này với:

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

Lưu ý không có chữ "x - thực thi" trên cột đầu tiên (quyền truy cập tệp).

Tệp hồ sơ không phải là tệp thực thi, thay vì thực thi chúng, bạn tải chúng bằng:

source /home/bakhtiyor/.bashrc

hoặc là

. /home/bakhtiyor/.bashrc

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

Đây là một ví dụ tôi đang tìm kiếm, một cách để nhập một vài chữ cái ở thiết bị đầu cuối ("vps") để đăng nhập từ xa vào máy chủ và cho phép chuyển tiếp X11 để tôi có thể chạy các ứng dụng gui như "gedit" qua mạng.

Dù lệnh / bí danh là gì, theo cách này với câu lệnh echo, dấu ngoặc kép và ký hiệu để nối đầu ra của lệnh vào một tệp (>>) hoạt động với tôi. Chỉ cần thay thế lệnh của tôi cho lệnh bí danh bạn cần và nhập nó vào thiết bị đầu cuối của bạn.


Các trích dẫn ở đây là hơi khó khăn. Trong ví dụ này, sử dụng dấu ngoặc kép là không hiệu quả, nhưng nếu văn bản trong dấu ngoặc kép chứa dấu đô la, dấu gạch chéo ngược, v.v., bạn sẽ cần hiểu cách trình bao xử lý chúng bên trong dấu ngoặc kép. Bạn có thể chuyển sang dấu ngoặc đơn ở bên ngoài và dấu ngoặc kép ở bên trong, nhưng sau đó bạn vẫn cần hiểu cách Bash xử lý dấu ngoặc kép trong định nghĩa bí danh.
tripleee

5

nếu bạn đang sử dụng ruby, bạn có thể cài đặt aka sử dụng rubygem.

gem install aka2

sử dụng

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 sẽ tự động nguồn tệp chấm của bạn để bạn không cần. Kiểm tra nó ra.


4

Tôi đã viết hàm hữu ích này để nhanh chóng tạo ra một bí danh mới, và sau đó viết định nghĩa bí danh cho ~/.bash_aliases (nếu nó tồn tại) hoặc ~/.bashrc.

MIPO : Đảm bảo ~/.bash_aliasestồn tại & được thực thi trong ~/.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
Ý tưởng tốt, nhưng bất cẩn khi sử dụng chức năng này có thể dẫn đến việc bỏ rác .bashrcvới nhiều trường hợp aliaslệnh. Chức năng của bạn chắc chắn cần phải thực hiện một số kiểm tra để tránh sự lộn xộn như vậy.
Kẻ gây rối-DV

Đây là một điểm hợp lệ. Bạn có một cách giải quyết được đề xuất mà bạn sẵn sàng chia sẻ @ Troupetaker-DV không?
blizzrdof77

Không chắc chắn nếu sau đó vẫn là 2 / 2yo thực tế, nhưng ... Lúc đầu tôi sẽ kiểm tra RC cho các lệnh bí danh để kiểm tra, nếu bí danh này đã được nhập vào đó để tránh trùng lặp. Kiểm tra của bạn cho sự tồn tại của một bí danh là không đủ, bởi vì RC có thể đã bị "ô nhiễm" với nhiều bí danh cùng tên.
Kẻ gây rối-DV

0

Tôi sẽ đề nghị sử dụng /etc/bash.bashrc

Bạn có thể thêm dòng ở cuối tập tin đó.

alias ok="ping google.com"

Sau khi đặt bí danh trên mỗi dòng, bạn phải khởi động lại hoặc đăng nhập lại.


7
"Tôi sẽ đề nghị .." và tại sao bạn lại đề nghị như vậy?
muru

2
Bạn không nên làm phiền với tệp hệ thống trừ khi bạn đặc biệt muốn cài đặt cài đặt toàn hệ thống cho tất cả người dùng. Trên hệ thống cá nhân, sự khác biệt là không đáng kể, nhưng sau đó việc xử lý các tệp hệ thống phức tạp hơn, do đó bạn có thể vẫn thích các tệp chấm cá nhân của riêng mình cho các tùy chọn cá nhân (và điều đó giúp sao chép các cài đặt ở nơi khác dễ dàng hơn tương lai cũng vậy).
tripleee

1
Khởi động lại? Đó là lời khuyên thực sự khủng khiếp, ĐỪNG làm điều đó, đặc biệt là khi source /etc/bash.bashrctất cả những gì bạn muốn trong ví dụ này. Nhưng nên sử dụng ~/.bashrchoặc ~/.bash_aliasesthay vào đó
Xen2050

@ Xen2050, tôi đề nghị khởi động lại để hiển thị nó hoạt động sau khi khởi động lại / relogin. Nhân tiện, ngay cả một cửa sổ đầu cuối sạch khác cũng sẽ hoạt động.
Fahad Ahammed

1
Bạn có thể nâng cấp lên kernel mới mà không cần khởi động lại, đây không phải là cửa sổ cũ ;-)
Xen2050

0

Như tôi nhớ, bashrcđã, hoặc đã có, một dòng gợi ý không sử dụng nó cho bí danh trực tiếp. Các giải pháp là sử dụng một tập tin bên ngoài (s). Các foobarbí danh đã được thêm vào, nhưng để thêm bazcác bashrctập tin phải được "nguồn gốc" (hoặc, chỉ cần mở một nhà ga mới). Ví dụ như:

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:~$ 

bây giờ bazbí danh hoạt động. Tôi chỉ mới nhận ra rằng một câu trả lời trước đó đã đề cập đến kỹ thuật này, nhưng họ đã chôn vùi cái đèn led.

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.