如何在Bash腳本中引入alias
更多精彩內容,請關注微信公眾號:後端技術小屋
alias的使用
在日常開發中,為了提高運維效率,我們會用alias(命令別名)來定義命令的簡稱。比如在~/.bash_profile
中添加:
alias ll='ls -lrt --color'
alias bdebug="go build -gcflags '-N -l'"
alias py3='/usr/bin/python3'
執行source ~/.bash_profile
之後,這些alias定義便載入到當前終端環境中,我們可以通過alias <cmd>
進行查看
$ alias ll
ll='ls -lrt --color'
$ alias bdebug
bdebug='go build -gcflags '\''-N -l'\'
在命令行執行alias也能看到預期效果
$ ll
total 44
-rw-rw-r-- 1 liyang liyang 62 Sep 16 09:38 test.c
-rw-rw-r-- 1 liyang liyang 68 Sep 16 09:38 foo.h
-rw-rw-r-- 1 liyang liyang 74 Sep 16 09:38 foo.c
-rwxrwxr-x 1 liyang liyang 8592 Sep 16 09:44 libfoo.so
-rw-rw-r-- 1 liyang liyang 4347 Sep 16 09:44 o23.s
-rwxrwxr-x 1 liyang liyang 9451 Sep 16 09:45 test
在Bash腳本中引入alias的問題
但是有些時候,我們希望將~/.bash_profile
中定義好的alias引入Bash腳本中,以便簡化命令。例如
腳本文件test.sh
#!/bin/bash
source ~/.bash_profile
ll
執行test.sh文件卻會報錯
$ bash test.sh
test.sh: line 5: ll: command not found
這是因為在Bash中,alias默認是不能引入Bash腳本中的。Bash的官方文檔其實更建議你使用function
而非alias
。那麼問題來了,既然我辛辛苦苦寫了這麼多alias,總不能全部改成function吧,那得多費勁?
幸好,解決方法還是有的.
解決方法
只需要在test.sh中加入一行shopt -s expand_aliases
新的腳本文件
#!/bin/bash
shopt -s expand_aliases
source ~/.bash_profile
ll
執行一下,果然成功了,這是為什麼呢?
$ bash test.sh
total 48
-rw-rw-r-- 1 liyang liyang 62 Sep 16 09:38 test.c
-rw-rw-r-- 1 liyang liyang 68 Sep 16 09:38 foo.h
-rw-rw-r-- 1 liyang liyang 74 Sep 16 09:38 foo.c
-rwxrwxr-x 1 liyang liyang 8592 Sep 16 09:44 libfoo.so
-rw-rw-r-- 1 liyang liyang 4347 Sep 16 09:44 o23.s
-rwxrwxr-x 1 liyang liyang 9451 Sep 16 09:45 test
-rw-rw-r-- 1 liyang liyang 64 Mar 8 21:33 test.sh
關鍵在於shopt -s expand_aliases
這句話,shopt
是一個命令,使用它可以控制一些shell相關的開關:expand_aliases
就是其中一個,當它被開啟之後,Bash腳本中的所有命令別名alias
都會被展開。
expand_aliases
If set, aliases are expanded as described below under Aliases, Aliases. This option is enabled by default for interactive shells.
總結
- alias命令可幫助我們自定義命令別名,簡化運維操作
- 預設情況下無法將終端環境中的alias引入到Bash腳本中
- 通過
shopt -s expand_aliases
,可以解決上述問題。
參考
//www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html
推薦閱讀
- 一文讀懂clickhouse集群監控
- 30分鐘入門Vim
- 30分鐘入門GDB
- STL源碼分析–vector
- zookeeper client原理總結
- redis實現分散式鎖
- 推薦幾個好用的效率神器
- C/C++關鍵字之restrict
- 現代C++之右值語義
- Python亂碼九問
- Linux Shell腳本攻略讀書筆記
更多精彩內容,請掃碼關注微信公眾號:後端技術小屋。如果覺得文章對你有幫助的話,請多多分享、轉發、在看。