我遇到了以下示例。我试着谷歌但找不到太多,所以我在这里发布这个问题。
以下是代码:
#!/bin/ksh
#! -*- perl -*-
eval 'exec $PERLLOCATION/bin/perl -x $0 ${1+"$@"} ;'
if 0;
print "hello world\n";
# how can I make it behave like a "normal" shell script from this point onwards? What needs to be done?
# echo "hello world" ### this results in error
答案 0 :(得分:5)
perlrun
文档中描述了这个习惯用法。
-x
开关会扫描整个文件,并忽略在以#!
开头并且还包含单词perl
的第一行之前出现的任何内容。
这意味着您的系统将使用Perl解释器运行脚本,无论您是使用perl
还是使用shell命令(sh/bash/ksh/
等)调用脚本。
也就是说,
$ perl this_script
和
$ sh this_script
将使用perl
运行脚本。
要解决第二个问题,这个习惯用法与在同一个文件中组合shell脚本和Perl脚本无关。有几种不同的方法可以解决这个问题,但最可读的方法是编写shell脚本,但使用shell的heredoc表示法来调用perl代码。
#!/bin/bash
# this is a bash script, but there is some Perl in here too
echo this line is printed from the shell
echo now let\'s run some Perl
perl <<EOF
# this is now perl script until we get to the EOF
print "This line is printed from Perl\n";
EOF
echo now this is from the shell script again
答案 1 :(得分:2)
这比已发布的内容简单。
#!$PERLLOCATION/bin/perl
不起作用,因为shebang(#!
)行由内核(而不是shell)解释,并且内核不进行变量插值。
代码调用ksh
来扩展环境变量并启动指定的Perl安装。
答案 2 :(得分:1)
1。如果您以通常的方式启动Perl脚本:
#!/usr/bin/perl
print "hello world\n";
只有在#!
下实际安装了Perl解释器时,/usr/bin
行才有效。您展示的perl / ksh双语脚本是一个棘手的方法,即使perl安装在其他地方也能使脚本正常工作。有关更多信息,请参阅例如http://alumnus.caltech.edu/~svhwan/prodScript/invokingPerl.html
2。你做不到。当shell进程遇到exec
命令时,它会终止并将控制权移交给perl。 (从技术上讲,它是executes perl in place of the shell, without creating a new process。)之后运行更多shell命令的唯一方法是启动一个新shell。