1

我正在查看一些 ksh 代码,遇到了一条我认为行不通的代码。在测试代​​码后,它确实有效,但我不知道为什么。

如果重要的话,这是在 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)

有关系吗?

提前致谢!

4

2 回答 2

3

如果命令名称的任何部分被引用,则 ksh 在选择要执行的内容时将忽略任何别名。

我想这就是原始脚本使用 \basename 的原因。

于 2010-11-11T17:36:21.867 回答
2

我遇到了一个相关但略有不同的情况。我正在编辑一个带有几个 rm 命令的 shell 脚本,这些命令写成:

\rm ...

我想知道为什么 '\' 在 rm 之前并且类似地尝试它只是发现它似乎确实有效。根据这个站点,这样做是为了防止脚本意外使用别名(例如,如果 rm 被别名为“rm -i”)。因为我首先找到了关于 Stack Overflow 的讨论,所以我想我会添加这一点,以防它帮助下一个人。

于 2011-03-30T20:02:48.290 回答