3

スペースを含むコマンドライン引数をプログラムに受け入れさせるには何が必要ですか?

さらに別の編集:プログラムの実行環境を設定するシェルスクリプトからプログラムが開始されていることを認識しました。いくつかの外部ライブラリがあるLD_LIBRARY_PATHため、現在の作業ディレクトリに設定されます。

#!/bin/sh

ARCH=`uname -m`
export LD_LIBRARY_PATH=".:lib/magic/linux-${ARCH}"

./data_sniffer.bin $*

exit $?

この問題は間違いなく に関連してい$*ます。コマンドライン パラメータを正しく転送する解決策はありますか?

からのコード スニペットを次に示しますmain()

if (stat(argv[1], &lStat) != 0)
{   
    fprintf(stderr, "Cannot stat(2) given file: %s. \n", argv[1]);
    return EXIT_FAILURE;
}   

次のパラメーターを使用してプログラムを開始しています。

./data_sniffer /mnt/pod/movies/some\ test\ movie\ file.avi

結果のエラー メッセージは次のようになります: Cannot stat(2) given file: /mnt/pod/movies/some.

ここで何が問題なのか誰にもわかりませんか?この問題を抱えたのは私が初めてではないと思います (ただし、ここで関連する質問が見つかりませんでした)。

4

2 に答える 2

8

ラッパー スクリプトでの使用を に置き換える./data_sniffer.bin $*と、引数が正しい方法で転送されます。./data_sniffer.bin "$@"

との違いの詳細については、$*こちらを参照してください$@"$@"


この質問の作者はそれを完全に変更し、問題に関するより多くの情報を提供しました.私はすでに書かれたものをすべてそのままにします.


についてargv..

開発者としてのあなたから多くを必要とするわけではありません.

'\ 'アプリケーションに渡された引数は、バイナリを実行するシェルによって処理されます。以下でこれを行うと、間違いなく希望どおりに動作するはずです (ただし、現在のシェルが正しく処理されないと主張しているのは奇妙ですが)。

./data_sniffer '/mnt/pod/movies/some test movie file.avi'
./data_sniffer /mnt/pod/movies/some\ test\ movie\ file.avi

# there should be no difference between the two

私のおすすめ

  • printf ("argv[1]: %s\n", argv[1]);メインの内容を検証するために、メインの最初で試してみましたか?

  • 正しいコマンドライン引数を使用して正しいバイナリを呼び出していますか?

悲しいことに、書くべき唯一の合理的なことは、あなたが何か間違ったことをしているということです. ただし、問題に関する詳細情報がなければ、何を回答することはできません。

もちろん可能ですが、シェルにバグがあるとは信じがたいです-私はそれを疑っています。


コマンドラインの解析はargv、開発者として心配する必要はありません。引数のスペースを処理するためにバイナリ自体に実装する必要がある強制機能はありません。

于 2012-07-14T12:54:18.630 に答える
4

CentOS 5.3で、テストを行いました。

#include <stdio.h>
int main(int argc, char** argv)
{
        printf("argc=%d\n", argc);
        int i = 0;
        for(i = 0; i<argc; i++)
        {   
                printf("argv[%d]=%s\n", i, argv[i]);
        }   
        return 0;
}

そして、さまざまなパラメータで実行します。

[root@dw examples]# ./a.out a b c
argc=4
argv[0]=./a.out
argv[1]=a
argv[2]=b
argv[3]=c
[root@dw examples]# ./a.out 'a b c'
argc=2
argv[0]=./a.out
argv[1]=a b c
[root@dw examples]# ./a.out a\ b\ c
argc=2
argv[0]=./a.out
argv[1]=a b c
[root@dw examples]# ./a.out "a b c"
argc=2
argv[0]=./a.out
argv[1]=a b c

したがって、(1)'abc';のようになります。(2)a \ b \ c; (3)「abc」はすべて機能しています。

于 2012-07-14T13:35:19.013 に答える