1

Unix の $PATH を変更するスクリプトを見たことがありますが、アイテムの重複を避けるために、次の手法を使用しています。

set path = ($path:q /some/new/path)
set path = ($path:q /another/directory)
set -f path = ($path:q)

仕組みがわかりません...

「-f」フラグのドキュメントには次のように書かれています:

ファイル名の生成を無効にする

私には意味がありません。そして、この奇妙な「:q」は何ですか?

ありがとう!

編集

このスーパーユーザーの質問は、「:q」が修飾子であることを理解するのに役立ちました。そしてtcsh manは次のように説明しています。

`:q' 修飾子が置換に適用されると、変数は複数の単語に展開され、各単語は空白で区切られ、後でコマンドまたはファイル名の置換を防ぐために引用符で囲まれます

2番目の編集:

実際、「-f」だけで魔法がかかるようです。

~$ set days = (Sunday Monday Tuesday Monday Sunday)
~$ echo $days
Sunday Monday Tuesday Monday Sunday
~$ set -f days = ($days)
~$ echo $days
Sunday Monday Tuesday

それでも、「ファイル名の生成を無効にする」の結果がどうなるかわかりません。

4

2 に答える 2

1

*、などを含むファイル名に遭遇した場合は、通常、ファイル名の生成を無効にする必要があります。ファイル名をワイルドカード パターンとして処理しないように、これらのファイルを処理する際に?{}注意が必要です。stack* という名前のファイルvim stack*を作成します。後でこのファイルを削除しないでください。これは、で始まる他のすべてのファイルstackも削除されるためです。ファイルを削除する別の方法は、引用符を使用することですrm "stack*"set +f必要に応じて、シェルでファイル名の生成を有効にすることができます。

于 2012-12-18T14:07:59.187 に答える
0

混乱は、kshマニュアルを読んでいるにもかかわらず、tcshシェルを使用しているという事実から生じます。 Tcsh構文は、非常に一般的な POSIX シェル構文とは大きく異なります。

このコマンドsetはシェルに組み込まれているため、 で実行setするtcshと、まったく異なるコマンドが からset実行されkshます。

からman tcsh:

   set [-r] [-f|-l] name=(wordlist) ... (+)
           ...
           If -f or -l are specified,  set only unique words keeping their
           order.   -f  prefers the first occurrence of a word, and -l the
           last.
于 2012-12-19T21:24:36.257 に答える