$は解釈しますが、*は解釈しないコードをどのように取得しますか? [閉鎖]

$は解釈しますが、*は解釈しないコードをどのように取得しますか? [閉鎖]

私はいくつかの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";
  }
}

ARGV [0]の内容は行で@allfiles = glob($ARGV[0]);解釈されます。私は彼らがそうしたくありません。たとえば、ARGV[0] が *.txt の場合、メタ文字のみが解釈されます。私はそうしたくありません。 glob()への入力として「*.txt」を使用したいと思います。どうすればいいですか?

答え1

zshシェルでは、次のものを使用できます。

alias myscript='noglob myscript'

noglobmultios次の単純コマンドの引数にワイルドカード文字が表示されないようにするシェルキーワード(オンの場合、リダイレクトは発生しません)。

これは引き続き実行できます。

ENV_VAR=value myscript args

または

<input myscript args

または簡単に使用できます

myscript "*.$ext"

拡張したいが$extグローブを拡張しない場合。

答え2

この場合、関数の代わりにbashエイリアスを使用することをお勧めします。 Bashのマニュアルでは、For almost every purpose, aliases are superseded by shell functionsこれが例外であると述べています。

普通こう言うと

 perl script *.txt

これにより、シェルは* .txtを展開します。この機能は「set + f」を使用してオフにできます。関数の使用の問題は、関数が呼び出されたときにシェルがパターンを拡張したため、エイリアスと関数を組み合わせて使用​​することがコツです。

alias script="set +f ; _script"
_script(){ set -f ; perl script "$@" ; }

その後実行

 script *.txt

"set +f; _script *.txt" として扱われるため、_script 関数を呼び出す前にモード拡張がオフになります。この関数はスキーマ拡張を再度開き、Perlスクリプトを呼び出します。

この問題を回避する別の方法は、シェル引用を使用して次のように話すことです。

  perl script '*.txt'

そして、引用符はシェルがパターン拡張を実行するのを防ぎます。

関連情報