一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

alias命令_Linux alias命令:給命令定義別名

 懶人看書館 2020-12-18
在操作 Linux 的過程中,最令你感到不爽的是什么?答:命令太多,選項太多,記不住。

命令可以通過本書學(xué)習(xí),但選項太多可真的不好辦了,我想即便是 Linux 大牛們,也不可能記住每個命令的所有選項吧。

幸好 Linux 系統(tǒng)中有一個叫作 alias 的命令,它可以給一些命令設(shè)置別名,利用它我們就可以不必記住太多復(fù)雜的選項,只需將這些選項設(shè)置成別名就好啦。

定義別名

定義別名的方法很簡單,格式如下所示:
alias [name[=value]]

這里需要注意的是:
  • 等號(=)前后不能有空格,否則就會出現(xiàn)語法錯誤了。
  • 如果value中有空格或tab,則value一定要使用引號(單、雙引號都行)括起來。

了解了別名的基礎(chǔ)知識之后,我們來看一個定義別名的例子:
[roc@roclinux ~]$ alias vi='vim'
這個例子定義了一個 vim 命令的別名,以后,當(dāng)我們執(zhí)行 vi 命令時,其實真正執(zhí)行的是 vim 命令。是不是很簡單呢!

如何查看別名

如果太熱衷于設(shè)置別名,那么你就會面臨著要記住很多別名的困擾,因此,學(xué)會查看所有已設(shè)置的別名,就顯得尤為重要了。

查看別名的方法也很簡單,直接輸入 alias 命令,不加任何選項和參數(shù)即可:
[roc@roclinux ~]$ alias
alias cp='cp -i'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

可以看到,系統(tǒng)把當(dāng)前可用的所有的別名都列出來了。仔細(xì)找一下,是不是可以看到剛才設(shè)置的那個別名了:alias vi='vim'。

查看單獨命令的別名

如果我們只想查看一個單獨命令是否設(shè)置了別名,那么方法有兩個。

方法一:使用 alias 命令加參數(shù)
[roc@roclinux ~]$ alias vi
alias vi='vim'

方法二:使用快捷鍵
當(dāng)在終端中輸入一個命令后,按下 Ctrl+Alt+E 組合鍵,假如設(shè)置了別名,那么別名自動會變成實際的命令。

注意:這個快捷鍵并非在所有終端中都可行,有些終端的快捷鍵會和這個快捷鍵沖突,這樣的話,該方法就不好使了。

如何取消別名

別名定義的太多了,往往帶來的不是方便,而是困擾。所以我們也需要掌握刪除別名的方法。

那么,如何刪除一個別名呢?可以使用 unalias 命令。比如,我們想刪除 vi='vim' 這個別名,可以這樣來操作:
#刪除別名設(shè)置
[roc@roclinux ~]$ unalias vi
 
#再看看, 已經(jīng)被刪除了吧
[roc@roclinux ~]$ alias
alias cp='cp -i'
alias dirA='echo work directory is /root'
alias dirB='echo work directory is $PWD'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
經(jīng)過仔細(xì)觀察,確實已經(jīng)找不到剛才定義的 vi 別名了。

如果你想刪除所有的別名,直接使用 unalias 命令的-a選項即可,只不過要謹(jǐn)慎使用,避免你設(shè)置的所有的別名一下子都被清除了,自己還得一個一個重新設(shè)置回來。
#刪除所有別名
[roc@roclinux ~]$ unalias -a
 
#空空如也
[roc@roclinux ~]$ alias

如何執(zhí)行命令本身而非別名

別名雖好,但也有它的弊端,比如定義的別名恰好和某個命令重名了,這就麻煩了,Shell 中執(zhí)行的將永遠(yuǎn)都是別名。這里,如果我們想執(zhí)行真正的那個命令而非別名,該怎么辦呢?有三種方法可以解決這個問題:
  • 方案一:使用命令的絕對路徑。
  • 方案二:切換到命令所在的目錄,執(zhí)行./command。
  • 方案三:在命令前使用反斜線(\)。

下面我們就通過示例來演示這三個方法:
#絕對路徑方法
[roc@roclinux ~]$ /bin/vi test.sh
 
#明確指定當(dāng)前路徑的方法
[roc@roclinux ~]$ cd /bin
[roc@roclinux bin]$ ./vi ~/test.sh
 
#使用反斜線的方法
[roc@roclinux bin]$ cd
[roc@roclinux ~]$ \vi test.sh
這里推薦大家使用最后一種方法,因為它既方便又實用。

如何讓別名永久有效

我們通過 alias 命令設(shè)置的別名,僅限于在當(dāng)前的 Shell 中使用,如果系統(tǒng)重啟了,那么新設(shè)置的別名就失效了。

如果想讓別名永久有效的話,就需要把所有的別名設(shè)置方案加入到($HOME)目錄下的 .alias 文件中(如果系統(tǒng)中沒有這個文件,你可以創(chuàng)建一個),然后在 .bashrc 文件中增加這樣一段代碼:
# Aliases
if [ -f ~/.alias ]; then
  . ~/.alias
fi
這樣設(shè)置后,無論怎樣重啟系統(tǒng),都不會影響設(shè)置的別名啦。

單引號和雙引號的困惑

在別名的應(yīng)用中,單引號和雙引號的使用是比較容易造成困惑的,請看下面的示例:
[root@roclinux ~]$ echo $PWD
/root
[root@roclinux ~]$ alias dirA="echo work directory is $PWD"
[root@roclinux ~]$ alias dirB='echo work directory is $PWD'
 
# 正確顯示
[root@roclinux ~]$ dirA            
work directory is /root
 
# 正確顯示
[root@roclinux ~]$ dirB
work directory is /root 
 
# 顯示不正確, 怎么回事?     
[root@roclinux ~]$ cd /
[root@roclinux /]$ dirA
work directory is /root     
 
# 正確顯示 
[root@roclinux /]$ dirB
work directory is /    

上面的程序最讓人困惑的是,別名中使用了 Shell 的系統(tǒng)變量 $PWD 來顯示當(dāng)前的目錄路徑,但當(dāng)目錄切換了之后,單引號的別名可以正常顯示,而雙引號的別名卻無法正常顯示了,這和我們使用 bash 的變量的經(jīng)驗正好相反。這是怎么回事呢?

其實問題的本質(zhì)在于,別名只是用來替代我們設(shè)置的命令。

下面就來看看 dirA 和 dirB 背后的真實面容:
[roc@roclinux ~]$ alias dirA
alias dirA="echo work directory is /root"
 
[roc@roclinux ~]$ alias dirB
alias dirB='echo work directory is $PWD'

看到了吧,使用雙引號的 dirA,通過 Shell 的變量轉(zhuǎn)換后已經(jīng)變成了字符串 echo work directory is/root,當(dāng)目錄切換后,當(dāng)然還是顯示字符串的內(nèi)容。而使用單引號的 dirB,由于不受 Shell 的影響,仍然保留著原來的設(shè)置 echowork directory is$PWD,當(dāng)切換目錄后再執(zhí)行,變量 $PATH 被 Shell 替換掉,因此,內(nèi)容被正確顯示了。

在 Shell 腳本中執(zhí)行別名的困惑

在 Shell 腳本中,alias 別名功能默認(rèn)是關(guān)閉的,如果將 alias 別名編寫到腳本中,而此時 Shell 內(nèi)置命令和 PATH 中均沒有與 alias 別名同名的命令,則 Shell 會“抱怨”找不到指定的命令。就像下面的例子中展示的一樣:
[roc@roclinux ~]$ cat test.sh
#!/bin/bash
ll
 
[roc@roclinux ~]$ ./test.sh
./test.sh: line 3: ll: command not found

有沒有辦法在 Shell 腳本中啟用 alias 別名功能呢?答案是有的,那就是使用 Shell 內(nèi)置的 shopt 命令來開啟 alias 別名擴(kuò)展選項 expand_aliases。我們現(xiàn)在就來試驗一下:
[roc@roclinux ~]$ shopt -s expand_aliases
[roc@roclinux ~]$ shopt expand_aliases
expand_aliases on
[roc@roclinux ~]$ ./test.sh
./test.sh: line 3: ll: command not found

悲劇,怎么還是提示同樣的錯,難道被忽悠了?不急,我們來分析一下,找出問題的原委:
[roc@roclinux ~]$ cat test.sh
#!/bin/bash
shopt expand_aliases
ll
 
[roc@roclinux ~]$ ./test.sh
expand_aliases off
./test.sh: line 5: ll: command not found

從我們的試驗中可以看出,上面程序執(zhí)行失敗的原因是:雖然在 Shell 中 expand_aliases 是 on 狀態(tài),但當(dāng)執(zhí)行 test.sh 時,會產(chǎn)生一個新的進(jìn)程去執(zhí)行,這個新的進(jìn)程中 expand_aliases 卻是 off 的狀態(tài)。

知道了這個原因,我們做出相應(yīng)修改,繼續(xù)試驗:
[roc@roclinux ~]$ cat test.sh
#!/bin/bash
 
shopt expand_aliases
shopt -s expand_aliases
shopt expand_aliases
 
ll
 
[roc@roclinux ~]$ ./test.sh
expand_aliases off
expand_aliases on
./test.sh: line 8: ll: command not found

這一次我們在腳本中強(qiáng)制把 expand_aliases 設(shè)置為 on 狀態(tài),這次應(yīng)該沒有問題了吧。但事與愿違,別名在腳本中仍然不生效。

作為一名合格的工程師,我們要有打破砂鍋問到底的精神,控制住幾近崩潰的情緒,我們繼續(xù)做試驗:
[roc@roclinux ~]$ cat test.sh
#!/bin/bash
##
 
shopt expand_aliases
shopt -s expand_aliases
shopt expand_aliases
alias
 
ll
[roc@roclinux ~]$ ./test.sh
expand_aliases off
expand_aliases on
./test.sh: line 10: ll: command not found
又發(fā)現(xiàn)了新情況,alias 命令竟然沒有輸出任何內(nèi)容!這還是執(zhí)行程序時新生成進(jìn)程的問題。從現(xiàn)象來看,應(yīng)該是腳本中的 alias 沒有繼承 Shell 中 alias 的設(shè)置內(nèi)容。

不賣關(guān)子啦,我們揭曉最終的答案,解決方法是使用 bash 的 --login 選項:
[roc@roclinux ~]$ cat test.sh
#!/bin/bash --login
##
 
shopt expand_aliases
shopt -s expand_aliases
shopt expand_aliases
alias
 
ll
 
[roc@roclinux ~]$ ./test.sh
expand_aliases off
expand_aliases on
alias list is
alias cp='cp -i'
alias l.='ls -d .*'
alias ll='ls -l'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
total 12
-rw-r--r-- 1 roc roc 740 Feb  5 16:21 cat.time.txt
-rwxr--r-- 1 roc roc 131 Feb  6 17:15 test1.sh
-rwxr--r-- 1 roc roc 121 Feb  6 17:45 test.sh
功夫不負(fù)有心人,這次終于執(zhí)行成功了!

bash 的 --login 選項的作用是使執(zhí)行腳本的子 Shell 成為一個 login Shell,而 login Shell 就會讀取系統(tǒng)和用戶的 profile 及 rc 文件,這樣就會順理成章地加載到 alias 的初始設(shè)置啦。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    五月婷婷六月丁香在线观看| 亚洲伦理中文字幕在线观看| 日韩中文字幕狠狠人妻| 国产精品第一香蕉视频| 午夜视频成人在线免费| 欧美日韩一级黄片免费观看| 老司机精品视频免费入口| 婷婷九月在线中文字幕| 我要看日本黄色小视频| 日本在线高清精品人妻| 国产又大又硬又粗又黄| 一区二区三区日韩中文| 欧美中文字幕一区在线| 亚洲一区二区精品免费| 最新日韩精品一推荐日韩精品| 国产精品一区二区丝袜| 嫩草国产福利视频一区二区| 99香蕉精品视频国产版| 黄色三级日本在线观看| 九九九热视频最新在线| 伊人久久青草地综合婷婷| 亚洲国产精品国自产拍社区| 午夜国产精品福利在线观看| 久久热在线免费视频精品| 日本精品免费在线观看| 精品国产av一区二区三区不卡蜜| 精品al亚洲麻豆一区| 91欧美亚洲精品在线观看| 国产成人亚洲精品青草天美| 欧美国产极品一区二区| 夫妻性生活黄色录像视频| 日韩精品一区二区三区含羞含羞草| 欧美野外在线刺激在线观看| 欧美日韩一区二区午夜| 国产熟女高清一区二区| 国产欧美日产久久婷婷| 欧美午夜一级艳片免费看| 中文字幕区自拍偷拍区| 果冻传媒在线观看免费高清| 欧美日韩亚洲精品内裤| 亚洲精品福利视频你懂的|