在下面的bash脚本中,调用“exec expect”来替换正在运行的bash进程,因此使用tcl / expect再次处理整个脚本。
我想知道第2行“#\”用于什么。
#!/bin/sh
#\
exec expect "$0" "$1"
puts "Hello!"
似乎用来评论tcl中的下一行?下面是这个名为1的脚本的输出。
$ ./1
Hello!
另一个问题是为什么在没有输入参数的情况下脚本中需要1美元?如果从“exec expect”行中删除“$ 1”,则输出为
$ ./1
": no such file or directory
答案 0 :(得分:2)
我认为通常这个成语是exec expect "$0" "${1+$@}"
,这是一种奇特的说法,如果有第一个论点,就给出所有的论点。那是为旧贝壳发明的。使用exec expect "$0" "$@"
,或更简单地
#!/usr/bin/env expect
答案 1 :(得分:2)
似乎用于评论tcl中的下一行?
是。 Tcl的反斜杠 - 换行 - 空白处理与注释交互,其中一个后果是您可以使用#\
使下一行成为注释。这在实践中是一个边缘案例。
另一个问题是,为什么在没有输入参数时脚本中需要
$1
?
没有必要。旧的首选方式是${1+"$@"}
,而在任何现代shell上它实际上只是"$@"
(${1+…}
是在一个相对常见的商业Unix中解决一个错误)。这有点神奇,但扩展到参数列表作为引用值,以便通过参数传递空格(等)可以工作。
#!/bin/sh
# \
exec expect "$0" "$@"
当然,委托给/usr/bin/env
会更好:
#!/usr/bin/env expect
因为很多更简单,并且根本不涉及任何黑客或诡计。