コマンドに複数のオプションが必要な場合は常に、オプションをグループ化します。たとえば、tar
iを使用してアーカイブを作成したい場合は、tar -cvf archive.tar file1 file2
オプションをまとめる必要がある正しい順序をどのように知ることができるのか疑問です。使用するとtar -cfv archive.tar file1 file2
エラーが表示されます。他の多くのコマンドでもこの問題が発生しました。私はこれが非常に愚かな疑いであることを知っていますが、それを克服するのに本当に大変な時間を費やしています。man
コマンドの説明も確認しましたが、要約セクションで特定の順序を指定します。特定の順序でオプションを結合することに関連するコンテンツが見つかりません。
答え1
特定のコマンドのマニュアルでは、そのオプションの使用方法を正確に説明しています。
この場合、-f
オプションはファイル名引数を使用します。オプションの引数(必要な場合)〜しなければならないちょうどそれの後ろに入れてください。最初のtar
コマンドでは、このファイル名パラメーターはですが、archive.tar
2番目のコマンドではですv
。
2番目のコマンドは、およびという3つv
のファイルで構成されたアーカイブを作成しようとします。存在しない可能性が高いため、エラーメッセージが表示されます。archive.tar
file1
file2
archive.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の各引数を処理し続けます。
ご覧のように、パラメータに複数の部分がある場合は、パラメータ処理の実装のため、その部分はすべてパラメータの直後になければなりません。