How can I output a command to a file, without getting a blank file on error?












6















I'm trying to run a command, write that to a file, and then I'm using that file for something else.



The gist of what I need is:



myAPICommand.exe parameters > myFile.txt


The problem is that myAPICommand.exe fails a lot. I attempt to fix some of the problems and rerun, but I get hit with "cannot overwrite existing file". I have to run a separate rm command to cleanup the blank myFile.txt and then rerun myAPICommand.exe.



It's not the most egregious problem, but it is annoying.



How can I avoid writing a blank file when my base command fails?










share|improve this question




















  • 1





    How is failure indicated? A return code? An empty file?

    – Jeff Schaller
    Dec 17 '18 at 14:52











  • @JeffSchaller error is written to the command line, in this case.

    – goodguy5
    Dec 17 '18 at 18:33











  • "command-line" meaning redirected to myFile.txt as "stdout", or to the screen in this case, as "stderr"?

    – Jeff Schaller
    Dec 17 '18 at 18:34











  • @JeffSchaller, I'm sorry. stderr

    – goodguy5
    Dec 17 '18 at 18:57






  • 4





    Sorry, but you're having it completely backwards; you should redirect the output to a temporary file, and rename the temp file to the final destination if your command succeeds. t=$(mktemp); trap 'rm -f "$t"' EXIT INT TERM; the_cmd >"$t" && mv "$t" the_file. That way, the output file will always contain valid data irrespective on whether the command succeeded or failed.

    – mosvy
    Dec 18 '18 at 0:53
















6















I'm trying to run a command, write that to a file, and then I'm using that file for something else.



The gist of what I need is:



myAPICommand.exe parameters > myFile.txt


The problem is that myAPICommand.exe fails a lot. I attempt to fix some of the problems and rerun, but I get hit with "cannot overwrite existing file". I have to run a separate rm command to cleanup the blank myFile.txt and then rerun myAPICommand.exe.



It's not the most egregious problem, but it is annoying.



How can I avoid writing a blank file when my base command fails?










share|improve this question




















  • 1





    How is failure indicated? A return code? An empty file?

    – Jeff Schaller
    Dec 17 '18 at 14:52











  • @JeffSchaller error is written to the command line, in this case.

    – goodguy5
    Dec 17 '18 at 18:33











  • "command-line" meaning redirected to myFile.txt as "stdout", or to the screen in this case, as "stderr"?

    – Jeff Schaller
    Dec 17 '18 at 18:34











  • @JeffSchaller, I'm sorry. stderr

    – goodguy5
    Dec 17 '18 at 18:57






  • 4





    Sorry, but you're having it completely backwards; you should redirect the output to a temporary file, and rename the temp file to the final destination if your command succeeds. t=$(mktemp); trap 'rm -f "$t"' EXIT INT TERM; the_cmd >"$t" && mv "$t" the_file. That way, the output file will always contain valid data irrespective on whether the command succeeded or failed.

    – mosvy
    Dec 18 '18 at 0:53














6












6








6


1






I'm trying to run a command, write that to a file, and then I'm using that file for something else.



The gist of what I need is:



myAPICommand.exe parameters > myFile.txt


The problem is that myAPICommand.exe fails a lot. I attempt to fix some of the problems and rerun, but I get hit with "cannot overwrite existing file". I have to run a separate rm command to cleanup the blank myFile.txt and then rerun myAPICommand.exe.



It's not the most egregious problem, but it is annoying.



How can I avoid writing a blank file when my base command fails?










share|improve this question
















I'm trying to run a command, write that to a file, and then I'm using that file for something else.



The gist of what I need is:



myAPICommand.exe parameters > myFile.txt


The problem is that myAPICommand.exe fails a lot. I attempt to fix some of the problems and rerun, but I get hit with "cannot overwrite existing file". I have to run a separate rm command to cleanup the blank myFile.txt and then rerun myAPICommand.exe.



It's not the most egregious problem, but it is annoying.



How can I avoid writing a blank file when my base command fails?







linux command-line output error-handling write






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Dec 17 '18 at 14:41







goodguy5

















asked Dec 17 '18 at 14:37









goodguy5goodguy5

1356




1356








  • 1





    How is failure indicated? A return code? An empty file?

    – Jeff Schaller
    Dec 17 '18 at 14:52











  • @JeffSchaller error is written to the command line, in this case.

    – goodguy5
    Dec 17 '18 at 18:33











  • "command-line" meaning redirected to myFile.txt as "stdout", or to the screen in this case, as "stderr"?

    – Jeff Schaller
    Dec 17 '18 at 18:34











  • @JeffSchaller, I'm sorry. stderr

    – goodguy5
    Dec 17 '18 at 18:57






  • 4





    Sorry, but you're having it completely backwards; you should redirect the output to a temporary file, and rename the temp file to the final destination if your command succeeds. t=$(mktemp); trap 'rm -f "$t"' EXIT INT TERM; the_cmd >"$t" && mv "$t" the_file. That way, the output file will always contain valid data irrespective on whether the command succeeded or failed.

    – mosvy
    Dec 18 '18 at 0:53














  • 1





    How is failure indicated? A return code? An empty file?

    – Jeff Schaller
    Dec 17 '18 at 14:52











  • @JeffSchaller error is written to the command line, in this case.

    – goodguy5
    Dec 17 '18 at 18:33











  • "command-line" meaning redirected to myFile.txt as "stdout", or to the screen in this case, as "stderr"?

    – Jeff Schaller
    Dec 17 '18 at 18:34











  • @JeffSchaller, I'm sorry. stderr

    – goodguy5
    Dec 17 '18 at 18:57






  • 4





    Sorry, but you're having it completely backwards; you should redirect the output to a temporary file, and rename the temp file to the final destination if your command succeeds. t=$(mktemp); trap 'rm -f "$t"' EXIT INT TERM; the_cmd >"$t" && mv "$t" the_file. That way, the output file will always contain valid data irrespective on whether the command succeeded or failed.

    – mosvy
    Dec 18 '18 at 0:53








1




1





How is failure indicated? A return code? An empty file?

– Jeff Schaller
Dec 17 '18 at 14:52





How is failure indicated? A return code? An empty file?

– Jeff Schaller
Dec 17 '18 at 14:52













@JeffSchaller error is written to the command line, in this case.

– goodguy5
Dec 17 '18 at 18:33





@JeffSchaller error is written to the command line, in this case.

– goodguy5
Dec 17 '18 at 18:33













"command-line" meaning redirected to myFile.txt as "stdout", or to the screen in this case, as "stderr"?

– Jeff Schaller
Dec 17 '18 at 18:34





"command-line" meaning redirected to myFile.txt as "stdout", or to the screen in this case, as "stderr"?

– Jeff Schaller
Dec 17 '18 at 18:34













@JeffSchaller, I'm sorry. stderr

– goodguy5
Dec 17 '18 at 18:57





@JeffSchaller, I'm sorry. stderr

– goodguy5
Dec 17 '18 at 18:57




4




4





Sorry, but you're having it completely backwards; you should redirect the output to a temporary file, and rename the temp file to the final destination if your command succeeds. t=$(mktemp); trap 'rm -f "$t"' EXIT INT TERM; the_cmd >"$t" && mv "$t" the_file. That way, the output file will always contain valid data irrespective on whether the command succeeded or failed.

– mosvy
Dec 18 '18 at 0:53





Sorry, but you're having it completely backwards; you should redirect the output to a temporary file, and rename the temp file to the final destination if your command succeeds. t=$(mktemp); trap 'rm -f "$t"' EXIT INT TERM; the_cmd >"$t" && mv "$t" the_file. That way, the output file will always contain valid data irrespective on whether the command succeeded or failed.

– mosvy
Dec 18 '18 at 0:53










3 Answers
3






active

oldest

votes


















11














You must have "noclobber" set, check the following example:



$ echo 1 > 1  # create file
$ cat 1
1
$ echo 2 > 1 # overwrite file
$ cat 1
2
$ set -o noclobber
$ echo 3 > 1 # file is now protected from accidental overwrite
bash: 1: cannot overwrite existing file
$ cat 1
2
$ echo 3 >| 1 # temporary allow overwrite
$ cat 1
3
$ echo 4 > 1
bash: 1: cannot overwrite existing file
$ cat 1
3
$ set +o noclobber
$ echo 4 > 1
$ cat 1
4


"noclobber" is only for overwrite, you can still append though:



$ echo 4 > 1
bash: 1: cannot overwrite existing file
$ echo 4 >> 1


To check if you have that flag set you can type echo $- and see if you have C flag set (or set -o |grep clobber).



Q: How can I avoid writing a blank file when my base command fails?



Any requirements? You could just simply store the output in a variable and then check if it is empty. Check the following example (note that the way you check the variable needs fine adjusting to your needs, in the example I didn't quote it or use anything like ${cmd_output+x} which checks if variable is set, to avoid writing a file containing whitespaces only.



$ cmd_output=$(echo)
$ test $cmd_output && echo yes || echo no
no
$ cmd_output=$(echo -e 'nnn')
$ test $cmd_output && echo yes || echo no
no
$ cmd_output=$(echo -e ' ')
$ test $cmd_output && echo yes || echo no
no
$ cmd_output=$(echo -e 'something')
$ test $cmd_output && echo yes || echo no
yes

$ cmd_output=$(myAPICommand.exe parameters)
$ test $cmd_output && echo "$cmd_output" > myFile.txt


Example without using a single variable holding the whole output:



log() { while read data; do echo "$data" >> myFile.txt; done; }
myAPICommand.exe parameters |log





share|improve this answer





















  • 1





    I like this answer and will likely accept it eventually. While it fixes my problem, it doesn't actually answer the question.

    – goodguy5
    Dec 17 '18 at 14:59











  • I have updated my answer if that helps.

    – Evolter
    Dec 17 '18 at 15:52













  • lovely. Thank you. I didn't think of shortcircuit logic.

    – goodguy5
    Dec 17 '18 at 16:10






  • 2





    I think you need to quote $cmd_output otherwise you get unexpected results if $cmd_output is (say) 1 == 2. If you want to protect against "$cmd_output" being only whitespace, I would consider piping it into grep -q with a suitable pattern.

    – Ben Millwood
    Dec 17 '18 at 16:35











  • I agree that it isn't bulletproof example @BenMillwood it just suppose to give an idea. With more requirements (different shells handle variables a bit differently, etc.) we could make it better :)

    – Evolter
    Dec 17 '18 at 16:50





















11














You can delete the file after running, if the command fails, with



myAPICommand parameters > myFile.txt || rm myFile.txt


But I would suggest clobbering the file instead:



myAPICommand parameters >| myFile.txt


See What are the shell's control and redirection operators? for details.






share|improve this answer































    3














    You could create a script to run the myAPICommand.exe, but have it first remove the myFile.txt if it exists. Then you don't have to constantly do the rm command to clean up.



    Like:



    if [ -e myFile.txt ]
    then
    rm myFile.txt && myAPICommand.exe
    else


    You could also make it so that your command cleans up after itself. If the file is empty adding something like the following.



    Like:



    if [ -s myFile.txt ]
    then
    EXIT 0
    else
    rm myFile.txt && EXIT 1
    fi





    share|improve this answer





















    • 1





      Or just rm -f it, which won't complain if the file doesn't exist.

      – Ben Millwood
      Dec 17 '18 at 16:36











    • True.. @BenMillwood

      – Michael Prokopec
      Dec 17 '18 at 16:37











    Your Answer








    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "106"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: false,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: null,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f489489%2fhow-can-i-output-a-command-to-a-file-without-getting-a-blank-file-on-error%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    3 Answers
    3






    active

    oldest

    votes








    3 Answers
    3






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    11














    You must have "noclobber" set, check the following example:



    $ echo 1 > 1  # create file
    $ cat 1
    1
    $ echo 2 > 1 # overwrite file
    $ cat 1
    2
    $ set -o noclobber
    $ echo 3 > 1 # file is now protected from accidental overwrite
    bash: 1: cannot overwrite existing file
    $ cat 1
    2
    $ echo 3 >| 1 # temporary allow overwrite
    $ cat 1
    3
    $ echo 4 > 1
    bash: 1: cannot overwrite existing file
    $ cat 1
    3
    $ set +o noclobber
    $ echo 4 > 1
    $ cat 1
    4


    "noclobber" is only for overwrite, you can still append though:



    $ echo 4 > 1
    bash: 1: cannot overwrite existing file
    $ echo 4 >> 1


    To check if you have that flag set you can type echo $- and see if you have C flag set (or set -o |grep clobber).



    Q: How can I avoid writing a blank file when my base command fails?



    Any requirements? You could just simply store the output in a variable and then check if it is empty. Check the following example (note that the way you check the variable needs fine adjusting to your needs, in the example I didn't quote it or use anything like ${cmd_output+x} which checks if variable is set, to avoid writing a file containing whitespaces only.



    $ cmd_output=$(echo)
    $ test $cmd_output && echo yes || echo no
    no
    $ cmd_output=$(echo -e 'nnn')
    $ test $cmd_output && echo yes || echo no
    no
    $ cmd_output=$(echo -e ' ')
    $ test $cmd_output && echo yes || echo no
    no
    $ cmd_output=$(echo -e 'something')
    $ test $cmd_output && echo yes || echo no
    yes

    $ cmd_output=$(myAPICommand.exe parameters)
    $ test $cmd_output && echo "$cmd_output" > myFile.txt


    Example without using a single variable holding the whole output:



    log() { while read data; do echo "$data" >> myFile.txt; done; }
    myAPICommand.exe parameters |log





    share|improve this answer





















    • 1





      I like this answer and will likely accept it eventually. While it fixes my problem, it doesn't actually answer the question.

      – goodguy5
      Dec 17 '18 at 14:59











    • I have updated my answer if that helps.

      – Evolter
      Dec 17 '18 at 15:52













    • lovely. Thank you. I didn't think of shortcircuit logic.

      – goodguy5
      Dec 17 '18 at 16:10






    • 2





      I think you need to quote $cmd_output otherwise you get unexpected results if $cmd_output is (say) 1 == 2. If you want to protect against "$cmd_output" being only whitespace, I would consider piping it into grep -q with a suitable pattern.

      – Ben Millwood
      Dec 17 '18 at 16:35











    • I agree that it isn't bulletproof example @BenMillwood it just suppose to give an idea. With more requirements (different shells handle variables a bit differently, etc.) we could make it better :)

      – Evolter
      Dec 17 '18 at 16:50


















    11














    You must have "noclobber" set, check the following example:



    $ echo 1 > 1  # create file
    $ cat 1
    1
    $ echo 2 > 1 # overwrite file
    $ cat 1
    2
    $ set -o noclobber
    $ echo 3 > 1 # file is now protected from accidental overwrite
    bash: 1: cannot overwrite existing file
    $ cat 1
    2
    $ echo 3 >| 1 # temporary allow overwrite
    $ cat 1
    3
    $ echo 4 > 1
    bash: 1: cannot overwrite existing file
    $ cat 1
    3
    $ set +o noclobber
    $ echo 4 > 1
    $ cat 1
    4


    "noclobber" is only for overwrite, you can still append though:



    $ echo 4 > 1
    bash: 1: cannot overwrite existing file
    $ echo 4 >> 1


    To check if you have that flag set you can type echo $- and see if you have C flag set (or set -o |grep clobber).



    Q: How can I avoid writing a blank file when my base command fails?



    Any requirements? You could just simply store the output in a variable and then check if it is empty. Check the following example (note that the way you check the variable needs fine adjusting to your needs, in the example I didn't quote it or use anything like ${cmd_output+x} which checks if variable is set, to avoid writing a file containing whitespaces only.



    $ cmd_output=$(echo)
    $ test $cmd_output && echo yes || echo no
    no
    $ cmd_output=$(echo -e 'nnn')
    $ test $cmd_output && echo yes || echo no
    no
    $ cmd_output=$(echo -e ' ')
    $ test $cmd_output && echo yes || echo no
    no
    $ cmd_output=$(echo -e 'something')
    $ test $cmd_output && echo yes || echo no
    yes

    $ cmd_output=$(myAPICommand.exe parameters)
    $ test $cmd_output && echo "$cmd_output" > myFile.txt


    Example without using a single variable holding the whole output:



    log() { while read data; do echo "$data" >> myFile.txt; done; }
    myAPICommand.exe parameters |log





    share|improve this answer





















    • 1





      I like this answer and will likely accept it eventually. While it fixes my problem, it doesn't actually answer the question.

      – goodguy5
      Dec 17 '18 at 14:59











    • I have updated my answer if that helps.

      – Evolter
      Dec 17 '18 at 15:52













    • lovely. Thank you. I didn't think of shortcircuit logic.

      – goodguy5
      Dec 17 '18 at 16:10






    • 2





      I think you need to quote $cmd_output otherwise you get unexpected results if $cmd_output is (say) 1 == 2. If you want to protect against "$cmd_output" being only whitespace, I would consider piping it into grep -q with a suitable pattern.

      – Ben Millwood
      Dec 17 '18 at 16:35











    • I agree that it isn't bulletproof example @BenMillwood it just suppose to give an idea. With more requirements (different shells handle variables a bit differently, etc.) we could make it better :)

      – Evolter
      Dec 17 '18 at 16:50
















    11












    11








    11







    You must have "noclobber" set, check the following example:



    $ echo 1 > 1  # create file
    $ cat 1
    1
    $ echo 2 > 1 # overwrite file
    $ cat 1
    2
    $ set -o noclobber
    $ echo 3 > 1 # file is now protected from accidental overwrite
    bash: 1: cannot overwrite existing file
    $ cat 1
    2
    $ echo 3 >| 1 # temporary allow overwrite
    $ cat 1
    3
    $ echo 4 > 1
    bash: 1: cannot overwrite existing file
    $ cat 1
    3
    $ set +o noclobber
    $ echo 4 > 1
    $ cat 1
    4


    "noclobber" is only for overwrite, you can still append though:



    $ echo 4 > 1
    bash: 1: cannot overwrite existing file
    $ echo 4 >> 1


    To check if you have that flag set you can type echo $- and see if you have C flag set (or set -o |grep clobber).



    Q: How can I avoid writing a blank file when my base command fails?



    Any requirements? You could just simply store the output in a variable and then check if it is empty. Check the following example (note that the way you check the variable needs fine adjusting to your needs, in the example I didn't quote it or use anything like ${cmd_output+x} which checks if variable is set, to avoid writing a file containing whitespaces only.



    $ cmd_output=$(echo)
    $ test $cmd_output && echo yes || echo no
    no
    $ cmd_output=$(echo -e 'nnn')
    $ test $cmd_output && echo yes || echo no
    no
    $ cmd_output=$(echo -e ' ')
    $ test $cmd_output && echo yes || echo no
    no
    $ cmd_output=$(echo -e 'something')
    $ test $cmd_output && echo yes || echo no
    yes

    $ cmd_output=$(myAPICommand.exe parameters)
    $ test $cmd_output && echo "$cmd_output" > myFile.txt


    Example without using a single variable holding the whole output:



    log() { while read data; do echo "$data" >> myFile.txt; done; }
    myAPICommand.exe parameters |log





    share|improve this answer















    You must have "noclobber" set, check the following example:



    $ echo 1 > 1  # create file
    $ cat 1
    1
    $ echo 2 > 1 # overwrite file
    $ cat 1
    2
    $ set -o noclobber
    $ echo 3 > 1 # file is now protected from accidental overwrite
    bash: 1: cannot overwrite existing file
    $ cat 1
    2
    $ echo 3 >| 1 # temporary allow overwrite
    $ cat 1
    3
    $ echo 4 > 1
    bash: 1: cannot overwrite existing file
    $ cat 1
    3
    $ set +o noclobber
    $ echo 4 > 1
    $ cat 1
    4


    "noclobber" is only for overwrite, you can still append though:



    $ echo 4 > 1
    bash: 1: cannot overwrite existing file
    $ echo 4 >> 1


    To check if you have that flag set you can type echo $- and see if you have C flag set (or set -o |grep clobber).



    Q: How can I avoid writing a blank file when my base command fails?



    Any requirements? You could just simply store the output in a variable and then check if it is empty. Check the following example (note that the way you check the variable needs fine adjusting to your needs, in the example I didn't quote it or use anything like ${cmd_output+x} which checks if variable is set, to avoid writing a file containing whitespaces only.



    $ cmd_output=$(echo)
    $ test $cmd_output && echo yes || echo no
    no
    $ cmd_output=$(echo -e 'nnn')
    $ test $cmd_output && echo yes || echo no
    no
    $ cmd_output=$(echo -e ' ')
    $ test $cmd_output && echo yes || echo no
    no
    $ cmd_output=$(echo -e 'something')
    $ test $cmd_output && echo yes || echo no
    yes

    $ cmd_output=$(myAPICommand.exe parameters)
    $ test $cmd_output && echo "$cmd_output" > myFile.txt


    Example without using a single variable holding the whole output:



    log() { while read data; do echo "$data" >> myFile.txt; done; }
    myAPICommand.exe parameters |log






    share|improve this answer














    share|improve this answer



    share|improve this answer








    edited Dec 18 '18 at 3:34

























    answered Dec 17 '18 at 14:52









    EvolterEvolter

    1614




    1614








    • 1





      I like this answer and will likely accept it eventually. While it fixes my problem, it doesn't actually answer the question.

      – goodguy5
      Dec 17 '18 at 14:59











    • I have updated my answer if that helps.

      – Evolter
      Dec 17 '18 at 15:52













    • lovely. Thank you. I didn't think of shortcircuit logic.

      – goodguy5
      Dec 17 '18 at 16:10






    • 2





      I think you need to quote $cmd_output otherwise you get unexpected results if $cmd_output is (say) 1 == 2. If you want to protect against "$cmd_output" being only whitespace, I would consider piping it into grep -q with a suitable pattern.

      – Ben Millwood
      Dec 17 '18 at 16:35











    • I agree that it isn't bulletproof example @BenMillwood it just suppose to give an idea. With more requirements (different shells handle variables a bit differently, etc.) we could make it better :)

      – Evolter
      Dec 17 '18 at 16:50
















    • 1





      I like this answer and will likely accept it eventually. While it fixes my problem, it doesn't actually answer the question.

      – goodguy5
      Dec 17 '18 at 14:59











    • I have updated my answer if that helps.

      – Evolter
      Dec 17 '18 at 15:52













    • lovely. Thank you. I didn't think of shortcircuit logic.

      – goodguy5
      Dec 17 '18 at 16:10






    • 2





      I think you need to quote $cmd_output otherwise you get unexpected results if $cmd_output is (say) 1 == 2. If you want to protect against "$cmd_output" being only whitespace, I would consider piping it into grep -q with a suitable pattern.

      – Ben Millwood
      Dec 17 '18 at 16:35











    • I agree that it isn't bulletproof example @BenMillwood it just suppose to give an idea. With more requirements (different shells handle variables a bit differently, etc.) we could make it better :)

      – Evolter
      Dec 17 '18 at 16:50










    1




    1





    I like this answer and will likely accept it eventually. While it fixes my problem, it doesn't actually answer the question.

    – goodguy5
    Dec 17 '18 at 14:59





    I like this answer and will likely accept it eventually. While it fixes my problem, it doesn't actually answer the question.

    – goodguy5
    Dec 17 '18 at 14:59













    I have updated my answer if that helps.

    – Evolter
    Dec 17 '18 at 15:52







    I have updated my answer if that helps.

    – Evolter
    Dec 17 '18 at 15:52















    lovely. Thank you. I didn't think of shortcircuit logic.

    – goodguy5
    Dec 17 '18 at 16:10





    lovely. Thank you. I didn't think of shortcircuit logic.

    – goodguy5
    Dec 17 '18 at 16:10




    2




    2





    I think you need to quote $cmd_output otherwise you get unexpected results if $cmd_output is (say) 1 == 2. If you want to protect against "$cmd_output" being only whitespace, I would consider piping it into grep -q with a suitable pattern.

    – Ben Millwood
    Dec 17 '18 at 16:35





    I think you need to quote $cmd_output otherwise you get unexpected results if $cmd_output is (say) 1 == 2. If you want to protect against "$cmd_output" being only whitespace, I would consider piping it into grep -q with a suitable pattern.

    – Ben Millwood
    Dec 17 '18 at 16:35













    I agree that it isn't bulletproof example @BenMillwood it just suppose to give an idea. With more requirements (different shells handle variables a bit differently, etc.) we could make it better :)

    – Evolter
    Dec 17 '18 at 16:50







    I agree that it isn't bulletproof example @BenMillwood it just suppose to give an idea. With more requirements (different shells handle variables a bit differently, etc.) we could make it better :)

    – Evolter
    Dec 17 '18 at 16:50















    11














    You can delete the file after running, if the command fails, with



    myAPICommand parameters > myFile.txt || rm myFile.txt


    But I would suggest clobbering the file instead:



    myAPICommand parameters >| myFile.txt


    See What are the shell's control and redirection operators? for details.






    share|improve this answer




























      11














      You can delete the file after running, if the command fails, with



      myAPICommand parameters > myFile.txt || rm myFile.txt


      But I would suggest clobbering the file instead:



      myAPICommand parameters >| myFile.txt


      See What are the shell's control and redirection operators? for details.






      share|improve this answer


























        11












        11








        11







        You can delete the file after running, if the command fails, with



        myAPICommand parameters > myFile.txt || rm myFile.txt


        But I would suggest clobbering the file instead:



        myAPICommand parameters >| myFile.txt


        See What are the shell's control and redirection operators? for details.






        share|improve this answer













        You can delete the file after running, if the command fails, with



        myAPICommand parameters > myFile.txt || rm myFile.txt


        But I would suggest clobbering the file instead:



        myAPICommand parameters >| myFile.txt


        See What are the shell's control and redirection operators? for details.







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Dec 17 '18 at 14:51









        Stephen KittStephen Kitt

        175k24401479




        175k24401479























            3














            You could create a script to run the myAPICommand.exe, but have it first remove the myFile.txt if it exists. Then you don't have to constantly do the rm command to clean up.



            Like:



            if [ -e myFile.txt ]
            then
            rm myFile.txt && myAPICommand.exe
            else


            You could also make it so that your command cleans up after itself. If the file is empty adding something like the following.



            Like:



            if [ -s myFile.txt ]
            then
            EXIT 0
            else
            rm myFile.txt && EXIT 1
            fi





            share|improve this answer





















            • 1





              Or just rm -f it, which won't complain if the file doesn't exist.

              – Ben Millwood
              Dec 17 '18 at 16:36











            • True.. @BenMillwood

              – Michael Prokopec
              Dec 17 '18 at 16:37
















            3














            You could create a script to run the myAPICommand.exe, but have it first remove the myFile.txt if it exists. Then you don't have to constantly do the rm command to clean up.



            Like:



            if [ -e myFile.txt ]
            then
            rm myFile.txt && myAPICommand.exe
            else


            You could also make it so that your command cleans up after itself. If the file is empty adding something like the following.



            Like:



            if [ -s myFile.txt ]
            then
            EXIT 0
            else
            rm myFile.txt && EXIT 1
            fi





            share|improve this answer





















            • 1





              Or just rm -f it, which won't complain if the file doesn't exist.

              – Ben Millwood
              Dec 17 '18 at 16:36











            • True.. @BenMillwood

              – Michael Prokopec
              Dec 17 '18 at 16:37














            3












            3








            3







            You could create a script to run the myAPICommand.exe, but have it first remove the myFile.txt if it exists. Then you don't have to constantly do the rm command to clean up.



            Like:



            if [ -e myFile.txt ]
            then
            rm myFile.txt && myAPICommand.exe
            else


            You could also make it so that your command cleans up after itself. If the file is empty adding something like the following.



            Like:



            if [ -s myFile.txt ]
            then
            EXIT 0
            else
            rm myFile.txt && EXIT 1
            fi





            share|improve this answer















            You could create a script to run the myAPICommand.exe, but have it first remove the myFile.txt if it exists. Then you don't have to constantly do the rm command to clean up.



            Like:



            if [ -e myFile.txt ]
            then
            rm myFile.txt && myAPICommand.exe
            else


            You could also make it so that your command cleans up after itself. If the file is empty adding something like the following.



            Like:



            if [ -s myFile.txt ]
            then
            EXIT 0
            else
            rm myFile.txt && EXIT 1
            fi






            share|improve this answer














            share|improve this answer



            share|improve this answer








            edited Dec 23 '18 at 13:48









            Jeff Schaller

            43.4k1160140




            43.4k1160140










            answered Dec 17 '18 at 16:31









            Michael ProkopecMichael Prokopec

            1,532218




            1,532218








            • 1





              Or just rm -f it, which won't complain if the file doesn't exist.

              – Ben Millwood
              Dec 17 '18 at 16:36











            • True.. @BenMillwood

              – Michael Prokopec
              Dec 17 '18 at 16:37














            • 1





              Or just rm -f it, which won't complain if the file doesn't exist.

              – Ben Millwood
              Dec 17 '18 at 16:36











            • True.. @BenMillwood

              – Michael Prokopec
              Dec 17 '18 at 16:37








            1




            1





            Or just rm -f it, which won't complain if the file doesn't exist.

            – Ben Millwood
            Dec 17 '18 at 16:36





            Or just rm -f it, which won't complain if the file doesn't exist.

            – Ben Millwood
            Dec 17 '18 at 16:36













            True.. @BenMillwood

            – Michael Prokopec
            Dec 17 '18 at 16:37





            True.. @BenMillwood

            – Michael Prokopec
            Dec 17 '18 at 16:37


















            draft saved

            draft discarded




















































            Thanks for contributing an answer to Unix & Linux Stack Exchange!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f489489%2fhow-can-i-output-a-command-to-a-file-without-getting-a-blank-file-on-error%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Bundesstraße 106

            Verónica Boquete

            Ida-Boy-Ed-Garten