如何让代码解释$但不解释*?

如何让代码解释$但不解释*?

我有一些 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

通过zshshell,您可以使用:

alias myscript='noglob myscript'

noglobmultios是一个 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 进行模式扩展。

相关内容