コマンドのさまざまなオプションを組み合わせるときの正しい順序

コマンドのさまざまなオプションを組み合わせるときの正しい順序

コマンドに複数のオプションが必要な場合は常に、オプションをグループ化します。たとえば、tariを使用してアーカイブを作成したい場合は、tar -cvf archive.tar file1 file2オプションをまとめる必要がある正しい順序をどのように知ることができるのか疑問です。使用するとtar -cfv archive.tar file1 file2エラーが表示されます。他の多くのコマンドでもこの問題が発生しました。私はこれが非常に愚かな疑いであることを知っていますが、それを克服するのに本当に大変な時間を費やしています。manコマンドの説明も確認しましたが、要約セクションで特定の順序を指定します。特定の順序でオプションを結合することに関連するコンテンツが見つかりません。

答え1

特定のコマンドのマニュアルでは、そのオプションの使用方法を正確に説明しています。

この場合、-fオプションはファイル名引数を使用します。オプションの引数(必要な場合)〜しなければならないちょうどそれの後ろに入れてください。最初のtarコマンドでは、このファイル名パラメーターはですが、archive.tar2番目のコマンドではですv

2番目のコマンドは、およびという3つvのファイルで構成されたアーカイブを作成しようとします。存在しない可能性が高いため、エラーメッセージが表示されます。archive.tar file1file2archive.tar

もう一度tarマニュアルでこれについて説明します。 GNUtarマニュアルには次の内容があります。

tar -c [-f ARCHIVE] [OPTIONS] [FILE...]

したがって、明らかに-fアーカイブの名前を使用します。もう少し下がるとこんな感じです。

-f--file=ARCHIVE

アーカイブファイルまたはデバイスを使用してくださいARCHIVE。 [...]

他のオプションを使用し、引数は-c使用-vしません。

また、通常、オプションはファイルオペランドよりも優先されます。一部のGNUツールでは、コマンドラインの最後にオプションを追加できます。例えば

tar -c -f archive.tar file1 file2 -v

-vただし、これは(IMHO)悪いスタイルであり、他の多くのUnices(ファイル名として解釈されます)で競合が発生します。

tar概要のようにコマンドを作成する100%正しい方法は次のとおりです。

tar -c -f archive.tar -v file1 file2

答え2

この問題は通常、次のパラメータが必要なオプションに関連しています。タールを例に挙げましょう。
-fファイル名が必須なので、後ろにファイル名を付ける必要があります。

擬似コードの引数解析の一般的な形式は、これを説明するのに役立ちます。引数はコマンドにベクトルとして提供されることを覚えておいてください(-cvfファイルはに分割されていますargv[0]=c argv[1]=v argv[2]=f argv[3]=file)。

While $argv is not empty
do
   case $argv[0] in # argv[0] is pointer to leftmost, or first, arg
       c) # single element argument
          set internal variable create_mode=true
          shift # remove argv[0], shifting all indexes down by 1, so argv[0] now points to former argv[1]
       f) # A double element argument
          set internal variable use_file=true
          shift
          set internal variable file_name=$argv[0] # We did a shift, so now argv[0] points to the argument following 'f'
          shift
       v) # Another single element argument 
          set internal variable verbose=true
          shift
      # and so on, there is a case for each possible argument, and shifts according to the number of elements in each argument
done 

ループは、argv(引数ベクトル)が空になるまでargvの各引数を処理し続けます。
ご覧のように、パラメータに複数の部分がある場合は、パラメータ処理の実装のため、その部分はすべてパラメータの直後になければなりません。

関連情報