56536

[code]

    system("ls パス名 > ファイル名");
    
[/code]

のように、 **パス名に変数を用いたい** のですが、どのようにすればいいのですか？  
ちなみに、"$変数名"とすると変数名が無視された結果となります。

ついでにと言っては何ですが、unixコマンドで、ダブルクォンテーション（""）の中で変数を用いる方法もご存知なら教えてください。（←気になってしまって・・・）


CC BY-SA 4.0
2019-07-09T21:33:39.323
56527
2019-07-10T04:11:54.683
2019-07-10T01:10:49.300
3060
28416
question
c unix
C言語のsystemコマンド内で変数を利用したい

[code]

    #include <stdio.h>
    #include <string.h>
    
    void main(void){
        char pathname[BUFSIZ];
        char filename[BUFSIZ];
        char buf[BUFSIZ];
    
        printf("input path : ");
        scanf_s("%s",pathname,BUFSIZ);
        printf("-- target path as >%s<\n",pathname);
    
        printf("input file name : ");
        scanf_s("%s",filename,BUFSIZ);
        printf("-- make file as >%s<\n",filename);
    
        if( (strlen(pathname) + strlen(filename)) > (BUFSIZ + 10)){
            printf(" %p or %p too long\n",pathname,filename);
            return;    // terminate
        }
    
        // make command string
        sprintf(buf,"dir %s > %s",pathname,filename);
    
        printf("-- >%s<\n",buf);
        system(buf);
    }
    
[/code]


CC BY-SA 4.0
2019-07-10T02:16:49.267
56534
2019-07-10T02:23:31.037
2019-07-10T02:23:31.037
5008
34980
56527
answer


`system()`
は、簡単に脆弱性を作りこむことができるので使い方に細心の注意が必要な代物で、安易に使うことはお勧めしません。下記ではその辺のセキュリティ的考察は一切略しています（この質問文に対する答えとしては遠すぎるため）。オイラの提示コードをそのまま実用に供さないでください。

  * 「変数」が [c](/questions/tagged/c "'c' のタグが付いた質問を表示") でいう文字列とか `int` であるなら

フツーに [c](/questions/tagged/c "'c' のタグが付いた質問を表示") プログラムで良くやる文字化を行うだけの話で

[code]

    char buf[BUFSIZE];
    snprintf(buf, BUFSIZE, "ls %s > filelist%d.txt", fn, no);
    system(buf);
    
[/code]

のように `snprintf()` で整形してから `system()` に渡せばよいです。

  * 変数が「シェル変数」であるなら、

`system()` はシェル `/bin/sh` とか `/usr/bin/dash` とか `/usr/local/bin/bash`
とかを新しく起動し、その新しいシェル上でコマンドを実行します。なので、「シェル変数」が現プログラムから新シェルに引き継がれる「環境変数」であるなら、そのまま指定すればよいです。

[code]

    system("echo $PATH;ls");
    putenv(strdup("PATH=a"));
    system("echo $PATH;ls");
    
[/code]

に対して結果は

[code]

    /usr/local/bin:/bin:/usr/bin:/usr/contrib/bin
    a.out shelltest.c
    a
    sh: ls: 見つかりません
    
[/code]

起動元プログラムの環境変数 `PATH` を子シェルに引き継ぐのでこうなります。

通常のシェル変数は子シェルに引き継がれませんから

> ちなみに、"$変数名"とすると変数名が無視された結果となります。

になるのは当然です。

* * *

shell glob 文字である `*` を展開するのはいつ・だれとか、シェル変数 `$abc`
を展開するのはいつ・誰とか、シェル変数やファイル名の中にスペースが含まれるときそれを、起動される側プログラムのコマンドライン引数として分離する処理をするのはいつ・誰とか、その辺を理解したうえで正しく使わないと
`system()` は実用に耐えません。実際、オイラの最初のサンプルにはいっぱい脆弱性があります。

* * *

シェルスクリプト内のダブルクォーテーションで括られたシェル変数はそのまま展開されますから特に何も指定は要らないっすよ？

[code]

    $ abc=xyz
    $ echo $abc "$abc" '$abc'
    xyz xyz $abc
    $ 
    
[/code]


CC BY-SA 4.0
2019-07-10T02:53:15.750
56536
2019-07-10T04:11:54.683
2019-07-10T04:11:54.683
8589
8589
56527
answer