2017-07-13 44 views
1

我在/etc/profile.d/中遇到了有關別名文件的問題。這並不重要。我只是感興趣,爲什麼它沒有按預期工作。命令在終端中工作,但不作爲配置文件中的別名。

所以基本上我在上面提到的路徑上有文件00-alias.sh,我想做一個快捷方式來讀取文件的特定行。所以這是我的代碼:

alias lnn='sed -n "${1}p" < "${2}"' 

與該代碼我應該能夠像

$ lnn 4 test.txt 

但是執行命令,這是行不通的。我只是得到錯誤

-bash: : No such file or directory


現在我就想,好吧,也許相對路徑都無效,因爲該文件位於/etc/profile.d/00-alias.sh

所以我繼續做了一個路徑像

alias pwd2='echo $(pwd)' 

新的別名,然後更新的profile.d與

source /etc/profile.d/00-alias.sh

而剛剛試過pwd2,但它迴應了我當前的路徑。所以理論上可以使用我寫的命令找到該文件。我仍然試圖通過文件到我的別名與絕對路徑像

$ lnn 4 /var/test.txt 

仍然同樣的錯誤如上。


但是,如果我在終端輸入別名的命令一樣

sed -n "4p" < test.txt 

它完美的罰款。如果我把引號test.txt


在這裏,無論是另一個奇怪的事情:如果我寫

alias lnn='sed -n "${1}p" < ${2}' 

不帶引號周圍${2}我得到的錯誤

-bash: ${2}: ambiguous redirect 

在終端它工作得很好...

那麼,我做錯了什麼?有沒有人有這個想法?我很想知道我的錯誤。但正如我所說,這不是一個真正的問題,因爲我只是好奇爲什麼bash的行爲如此。

+0

如果您想傳遞變量,請使用其中的命令創建腳本,然後爲該腳本設置別名。然後您可以將變量傳遞給別名。 –

回答

2

bash中的別名不帶任何形式的參數。保存痛苦並改用功能。

function lnn() { 
    sed -n "${1}p" < "${2}" 
} 

一次調用由命令行功能之前添加的功能將文件00-alias.sh和來源。

source /etc/profile.d/00-alias.sh 
lnn 4 test.txt 

BashFAQ/80: How can I make an alias that takes an argument?

你不能看到更多的信息。 bash中的別名是非常基本的,並不適合任何嚴肅的目的。 bash手冊頁,即使是這麼說的明確:

摘錄從GNU bash man page,有關別名

..有在替換文本使用參數的機制。如果需要參數,應該使用shell函數。


在一個側面說明問題無關相對路徑(或)左右,只記得別名是在腳本中不不允許的。它們只允許在交互式shell中。如果您正在編寫腳本,請始終使用函數。

+0

謝謝!這工作得很好。我不知道這些論點是不允許的。你應該提到,'alias lnn ='lnn'這一行仍然是需要的。 (至少對我而言,它只能用於該行) – NullDev

+0

@NullDev:將函數添加到文件並獲取它的源代碼後,該函數將在當前shell中可用,因此不需要別名定義。 ;) – Inian

+0

是的,我做到了,但仍收到「模棱兩可的重定向」。也許該文件只是沒有正確地重新載入 – NullDev

相關問題