2010-11-11 62 views
1

我正在查看一些ksh代碼並遇到了一條我認爲不可行的線。在測試代​​碼時,它確實有效,但我不知道爲什麼。Kornshell中的反斜線

如果很重要,它將在AIX 5.3系統上運行。

的代碼行是:

scriptname=$(\basename $0) 

我沒想到它會因爲basename命令前反斜槓的工作,但是當我測試的scriptname變量,它有正確的值。

我沒有在命令行上一些進一步的測試:

$ echo $(\echo test) 
test 
$ echo $(\echo \test) 
test 
$ echo $(\e\c\h\o \test) 
test 
$ echo `\e\c\h\o \test` 
test 
$ echo $(\echo "\test") 
est 

我想它的命令託換之外,它還是像我以爲沒有工作,它會:

$ \echo \testi\ng 
testing 
$ \echo "\testi\ng" 
     esti 
g 

最後一個是唯一對我有意義的人。

Kornshell只是忽略反斜槓,或者只是將它們轉換爲反斜槓前面的字符?我認爲在命令行中的任何位置放置一個\n將是一個換行符,但顯然只有在引號內或\\n

有人可以解釋一下ksh在命令行中使用反斜槓嗎?

無論哪種方式,我認爲更好的方式來寫我最初的質疑會是命令:的

scriptname=$(basename $0) 

代替:

scriptname=$(\basename $0) 

什麼關係呢?

在此先感謝!

回答

3

如果命令名的任何部分被引用,那麼當選擇執行什麼時,ksh將忽略任何別名。

我推測這就是爲什麼原始腳本使用\ basename。

+0

有趣。反斜槓有什麼缺點,除了看起來很奇怪嗎? – BrianH 2010-11-11 18:58:59

+0

沒有人知道,除了讓那些不熟悉的人感到困惑。 – Darron 2010-11-12 16:56:48

1

我遇到了一個相關但略有不同的情況。我編輯的shell腳本編寫的幾個RM命令:

\rm ... 

我想知道爲什麼「\」是RM之前,同樣試了一下才發現,它確實工作。根據這site,這是爲了防止腳本意外地使用別名(例如,如果rm被別名爲'rm -i')。由於我首先發現了關於堆棧溢出的討論,因此我認爲我會添加這一點以防下一個人出局。