2010-11-11 128 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')。由于我首先发现了关于堆栈溢出的讨论,因此我认为我会添加这一点以防下一个人出局。