shell腳本中使用alias

Linux shell有交互式與非交互式兩種工做模式。咱們平常使用shell輸入命令獲得結果的方式是交互式的方式,而shell腳本使用的是非交互式方式。shell

shell提供了alias功能來簡化咱們的平常操做,使得咱們能夠爲一個複雜的命令取一個簡單的名字,從而提升咱們的工做效率。在交互式模式下,shell的alias擴展功能是打開的,所以咱們能夠鍵入本身定義的alias別名來執行對應的命令。bash

可是,在非交互式模式下alias擴展功能默認是關閉的,此時仍然能夠定義alias別名,可是shell不會將alias別名擴展成對應的命令,而是將alias別名自己看成命令執行,若是shell內置命令和PATH中均沒有與alias別名同名的命令,則shell會「抱怨」找不到指定的命令。

那麼,有沒有辦法在非交互式模式下啓用alias擴展呢?答案是使用shell內置命令shopt命令來開啓alias擴展選項。shopt是shell的內置命令,能夠控制shell功能選項的開啓和關閉,從而控制shell的行爲。shopt的使用方式以下:ide

1 shopt -s opt_name                 Enable (set) opt_name.
2 shopt -u opt_name                 Disable (unset) opt_name.
3 shopt opt_name                    Show current status of opt_name.

alias擴展功能的選項名稱是expand_aliases,咱們能夠在交互式模式下查看此選項是否開啓:spa

1 sw@gentoo ~ $ shopt expand_aliases
2 expand_aliases  on
3 sw@gentoo ~ $

可見在交互式模式下alias擴展功能的確是開啓的,所以咱們才能使用alias別名。code

咱們編寫一個腳原本驗證一下非交互式模式下alias擴展的設置:orm

1 #!/bin/bash --login
2
3 alias echo_hello="echo Hello!"
4 shopt expand_aliases  
5 echo_hello
6
7 shopt -s  expand_aliases 
8 shopt expand_aliases  
9 echo_hello

腳本執行結果以下:繼承

1 sw@gentoo ~ $ ./test.sh
2 expand_aliases  off
3 ./test.sh: line 5: echo_hello: command not found
4 expand_aliases  on
5 Hello!
6 sw@gentoo ~ $

能夠看到,在非交互式模式下alias擴展功能默認是關閉的,可是咱們能夠用shopt來將其開啓。string

另外,alias別名只在當前shell有效,不能被子shell繼承,也不能像環境變量同樣export。能夠把alias別名定義寫在.bashrc文件中,這樣若是啓動交互式的子shell,則子shell會讀取.bashrc,從而獲得alias別名定義。可是執行shell腳本時,啓動的子shell處於非交互式模式,是不會讀取.bashrc的。it

不過,若是你必定要讓執行shell腳本的子shell讀取.bashrc的話,能夠給shell腳本第一行的解釋器加上參數:io

1 #!/bin/bash --login

--login使得執行腳本的子shell成爲一個login shell,login shell會讀取系統和用戶的profile及rc文件,所以用戶自定義的.bashrc文件中的內容將在執行腳本的子shell中生效。

還有一個簡單的辦法讓執行腳本的shell讀取.bashrc,在腳本中主動source ~/.bashrc便可。

相關文章
相關標籤/搜索