我是一个新的 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 脚本而无需明确调用它?
答案1
我将进行猜测并假设您的文件(在 Windows 中开发)是 DOS(CRLF)格式。
这会干扰整个过程,并导致出现不太清晰的消息:
$ ./my_script.pl
: No such file or directory
看https://stackoverflow.com/questions/3569997/view-line-endings-in-a-text-file如何验证行尾。
例如:
bash-4.1$ cat -v my_script.pl
#!/usr/bin/env perl^M
^M
print "Hello World\n";^M
^M
然后有不同的工具(例如 dos2unix 或 fromdos)可以帮助您将文本文件转换为正确的 unix 行尾。
转换后:
$ cat -v my_script.pl
#!/usr/bin/env perl
print "Hello World\n";
您将能够执行它们:
$ chmod 755 my_script.pl
$ ./my_script.pl
Hello World
答案2
为了解决这个问题,您可以使用#!/usr/bin/env perl
hash-bang 行,而不是#!/usr/bin/perl
让 bash 使用在您的 PATH 中找到的第一个 Perl。
引自http://perlmaven.com/hashbang
虽然我们使用 #!/usr/bin/perl 作为我们的哈希行,但也可以有其他版本。例如,如果我们在不同位置安装了另一个版本的 perl,并且我们希望我们的脚本使用该版本,那么我们可以输入该版本的 perl 的路径。例如 #!/opt/perl-5.18.2/bin/perl。
设置 hash-bang(并打开可执行位)的优点是用户不必知道脚本是用 Perl 编写的,并且如果您的系统上有多个 Perl 实例,则可以使用 hash-bang 行来选择要使用的 perl。这对于特定机器上的所有人来说都是相同的。缺点是,只有当脚本作为 ./hello.pl 或 hello.pl 执行时,才会使用 hash-bang 行中列出的 perl。如果将其作为 perl hello.pl 执行,它将使用在 PATH 中列出的目录中首先找到的 perl 版本。这可能是与 hash-bang 行中的 perl 版本不同的版本。
答案3
换个角度猜测:你的脚本是否具有可执行权限?
ls -l
应该列出权限,rwxrwxr-x
以便将文件作为脚本运行。您可以在 GUI 中修改权限(右键单击 →特性,并且取决于你的文件管理程序,通常类似于权限选项卡中的设置如下执行:□ 允许将文件作为程序执行)或从带有 的文本 shell 中设置chmod
;例如,chmod u=rwx,g=rwx,o=rx my_script.pl
设置“拥有该文件的用户可以读取、写入和执行它;拥有该文件的组成员可以执行相同操作;其他人可以读取或执行(但不能写入)它”
答案4
谢谢大家,我找到了一个可行的解决方案。
我只使用一个版本的 perl。我在默认的 Ubuntu 14.04 LTS 安装中使用默认的 perl 安装,并使用默认工具 bash 和 gedit。
在 cmd 行上使用裸“myscript.pl”我收到奇怪的“没有这样的文件”、“找不到命令”或“无法执行二进制文件...”消息。
使用 chmod u=x,我更改了 x 位。脚本仍然无法运行。
然后,我使用 gedit,用 Unix LF 而不是 DOS CR/LF 保存了 UTF-8 文件。仍然无法运行。
然后,使用 './myscript.pl',bingo!它最终使用 !#/usr/bin/perl 运行。
结论:来自 Windows 的 Linux 用户必须学习一些 Unix……
我的脚本现在可以在 Linux 和 Windows 上运行,并能正确打印和排序带重音字符的文件名和消息前提是它以正确的默认格式保存,对于 Linux,使用 UTF-8 和 Unix LF,对于 Windows,使用 ISO-8849-1 或 ANSI 和 CR/LF。
如果有人想了解更多信息,我可以发布一个精确执行此操作的准系统测试版本。