shell不能識別alias 解決方案

2021-09-27 13:14:08 字數 1791 閱讀 4452

在bash的非互動模式下(一般的指令碼), alias是無效的.

例如, 我在.bashrc設定了:

在非互動式模式下alias擴充套件功能預設是關閉的,此時仍然可以定義alias別名,但是shell不會將alias別名擴充套件成對應的命令,而是將alias別名本身當作命令執行,如果shell內建命令和path中均沒有與alias別名同名的命令,則shell會「抱怨」找不到指定的命令。

如果想使得非互動模式下支援alias擴充套件, 就要使用shopt expand_aliases. 注意shopt這個命令是shell內建命令,可以控制shell功能選項的開啟和關閉,從而控制shell的行為。shopt的使用方式如下:

shopt -s opt_name # enable (set) opt_name.

shopt -u opt_name # disable (unset) opt_name.

shopt opt_name # show current status of opt_name.

測試一下alias在非互動模式的表現和使用shopt的異同:

#!/bin/bash

alias echo_hello=「echo hello!」

shopt expand_aliases

echo_hello

#> expand_aliases off

#> ./test.sh: line 5: echo_hello: command not found

shopt -s expand_aliases

shopt expand_aliases

echo_hello

#> expand_aliases on

#> hello!

另外,alias別名只在當前shell有效,不能被子shell繼承,也不能像環境變數一樣export。可以把alias別名定義寫在.bashrc檔案中,這樣如果啟動互動式的子shell,則子shell會讀取.bashrc,從而得到alias別名定義。但是執行shell指令碼時,啟動的子shell處於非互動式模式,是不會讀取.bashrc的。

不過,如果你一定要讓執行shell指令碼的子shell讀取.bashrc的話,可以給shell指令碼第一行的直譯器加上引數:

#!/bin/bash --login

–login使得執行指令碼的子shell成為乙個login shell,login shell會讀取系統和使用者的profile及rc檔案,因此使用者自定義的.bashrc檔案中的內容將在執行指令碼的子shell中生效。

還有乙個簡單的辦法讓執行指令碼的shell讀取.bashrc,在指令碼中主動source ~/.bashrc即可。

還有一種解決辦法是用source命令:

source script.sh

使當前shell讀入路徑為script.sh的檔案並依次執行檔案中的所有語句。

那麼source和sh去執行指令碼有什麼不同呢?

sh script.sh 會重新建立乙個子shell,在子shell中執行指令碼裡面的語句,該子shell繼承父shell的環境變數,但子shell是新建的,其改變的變數不會被帶回父shell,除非使用export。

source script.sh是簡單地讀取指令碼裡面的語句依次在當前shell裡面執行,沒有建立新的子shell。那麼指令碼裡面所有新建、改變變數的語句都會儲存在當前shell裡面。

那麼sh script.sh和./script.sh又有什麼不同呢?

相同的是它們都是新建乙個子shell去執行指令碼,不同的是./script.sh要求script.sh必須具有執行許可權。

乙個簡單的alias的例子是:

alias ll=ls -l

在Shell中使用alias

以前在linux跳機上登入其他伺服器 ssh ip 為了方便,把很多伺服器的ip和業務名稱touch到了使用者主目錄下,這樣方便了好多,每次ls l 出來下就可以了,然後複製,貼上就方便了。如下圖。這樣每次複製貼上還是不是特別方便,所以行能不能輸入業務名字,直接就登入了,仍然保持著touch的檔案 ...

phg不能識別Trilinos

先安裝的trilinos,以及其中的特徵值解法器anasazi,但是在配置phg時就是不能識別出trilinos,檢查config.log時,發現下面的資訊 conftest.cpp 71 34 fatal error epetra mpicomm.h no such file or directo...

INSERT EXEC PROC不能巢狀的解決方法

insert exec proc不能巢狀的解決方法 儲存過程c返回乙個結果集,儲存過程b用insert exec proc將c返回的結果集存入乙個臨時表中並返回乙個結果集,如果儲存過程a用insert exec proc再將b的結果集存入乙個臨時表,這時會報錯 insert exec 語句不能巢狀。...