我有一些 Perl 代码(不要关注它现在的作用,我仍在研究它):
#!/usr/bin/perl -w
if(!@ARGV)
{
print ("ERROR: NO ARGS\n");
exit 1;
}
else
{
use Cwd qw(cwd);
my $dir = cwd;
print $ARGV[0];
@allfiles = glob($ARGV[0]);
foreach $file (@allfiles){
print "$file\n";
}
}
线路上@allfiles = glob($ARGV[0]);
正在解释 ARGV[0] 的内容。我不希望他们这样。例如,如果 ARGV[0] 是 *.txt,它只会解释元字符。我不希望它这样做。我希望它使用“*.txt”作为 glob() 的输入;我该怎么做呢?
答案1
通过zsh
shell,您可以使用:
alias myscript='noglob myscript'
noglob
multios
是一个 shell 关键字,可防止以下简单命令的参数中出现通配符(如果打开,则不会重定向)。
请注意,您仍然可以这样做
ENV_VAR=value myscript args
或者
<input myscript args
或者你可以简单地使用
myscript "*.$ext"
如果您希望$ext
扩展 ,但不扩展 glob 。
答案2
在这种情况下,我建议使用 bash 别名而不是函数。 bash 手册说For almost every purpose, aliases are superseded by shell functions
,这是例外。
通常如果你说
perl script *.txt
然后 shell 将展开 *.txt。可以使用“set +f”关闭此功能。使用函数的问题在于,当调用函数时,shell 已经扩展了模式,因此技巧是使用别名和函数的组合。
alias script="set +f ; _script"
_script(){ set -f ; perl script "$@" ; }
然后运行
script *.txt
将被处理为“set +f ; _script *.txt”,因此在调用 _script 函数之前模式扩展被关闭。该函数重新打开模式扩展,然后调用 perl 脚本。
避免此问题的另一种方法是使用 shell 引用,并说
perl script '*.txt'
并且引号将阻止 shell 进行模式扩展。