我是一个新的 Ubuntu 用户,试图在 Windows 7 上运行在 Straberry Perl 上开发的脚本。我的 Ubuntu 环境是 Ubuntu 14.04 LTS 和 Perl 5.18.2。
我的脚本的第一行是#!/usr/bin/perl,它应该调用 /usr/bin 中的 perl 解释器,实际上,那里有一个 10.2 Kb 的对象。但是,除非“perl”是终端上的第一个命令行参数,否则我的脚本不会运行,如perl myscript.pl.
有没有办法让 perl 自动运行 .pl 脚本而不显式调用它?
小智 10
我将猜测并假设您的文件(在 Windows 中开发)是 DOS (CRLF) 格式。
这将干扰shebang,失败并显示不太清楚的消息:
$ ./my_script.pl
: No such file or directory
Run Code Online (Sandbox Code Playgroud)
有关如何验证行尾的信息,请参阅/sf/ask/249899821/。
例如:
bash-4.1$ cat -v my_script.pl
#!/usr/bin/env perl^M
^M
print "Hello World\n";^M
^M
Run Code Online (Sandbox Code Playgroud)
然后有不同的工具(例如 dos2unix 或 fromdos)可以帮助您将文本文件转换为正确的 unix 行尾。
转换后:
$ cat -v my_script.pl
#!/usr/bin/env perl
print "Hello World\n";
Run Code Online (Sandbox Code Playgroud)
你将能够执行它们:
$ chmod 755 my_script.pl
$ ./my_script.pl
Hello World
Run Code Online (Sandbox Code Playgroud)
为了解决这个问题,您可以使用#!/usr/bin/env perlhash-bang 行,而不是#!/usr/bin/perl让 bash 使用在您的 PATH 中找到的第一个 Perl。
引自http://perlmaven.com/hashbang
虽然我们使用 #!/usr/bin/perl 作为我们的 hash-bang 行,但也可以使用其他行。例如,如果我们在不同的位置安装了另一个版本的 perl,并且我们希望我们的脚本使用它,那么我们可以放置该版本 perl 的路径。例如#!/opt/perl-5.18.2/bin/perl。
设置 hash-bang(并打开可执行位)的优点是用户不必知道脚本是用 Perl 编写的,如果您的系统上有多个 Perl 实例,可以使用 hash-bang 行选择要使用的 perl。这对于特定机器上的所有人都是一样的。缺点是 hash-bang 行中列出的 perl 仅在脚本作为 ./hello.pl 或 hello.pl 执行时使用。如果它作为 perl hello.pl 执行,它将使用在 PATH 中列出的目录中首先找到的 perl 版本。这可能是与 hash-bang 行中的 perl 版本不同的 perl 版本。