How to make a pipeline wait for end-of-file or stop after an error?Make program first read from pipe, then from keyboardWait until no incoming network connection for N minutes, then execute a commandShell script wait for background commandNamed pipes: several experiments leads to confusionPrevent stdin wait for first message from named pipeHow can pipe producer tell pipe consumer it has reached 'End of File'?" (un-named-pipe, not named-pipe)Create Bash Script to Wait and then RunFile system for Pipe DeviceHow to wait for user to close vim then run command in shell scriptRun a command in the background, wait for a particular log line, then run a new command in the foreground

Question about かな and だろう

A strange hotel

What is Niska's accent?

How to make a pipeline wait for end-of-file or stop after an error?

Phrase for the opposite of "foolproof"

How much cash can I safely carry into the USA and avoid civil forfeiture?

How to stop co-workers from teasing me because I know Russian?

Checks user level and limit the data before saving it to mongoDB

Why do games have consumables?

Why was Germany not as successful as other Europeans in establishing overseas colonies?

Is it idiomatic to construct against `this`?

Does Gita support doctrine of eternal cycle of birth and death for evil people?

Does holding a wand and speaking its command word count as V/S/M spell components?

Are Boeing 737-800’s grounded?

Why is it that the natural deduction method can't test for invalidity?

Critique of timeline aesthetic

How come there are so many candidates for the 2020 Democratic party presidential nomination?

Size of electromagnet needed to replicate Earth's magnetic field

Minor Revision with suggestion of an alternative proof by reviewer

Why must Chinese maps be obfuscated?

To say I met a person for the first time

Map of water taps to fill bottles

Contradiction proof for inequality of P and NP?

web3.py web3.isConnected() returns false always



How to make a pipeline wait for end-of-file or stop after an error?


Make program first read from pipe, then from keyboardWait until no incoming network connection for N minutes, then execute a commandShell script wait for background commandNamed pipes: several experiments leads to confusionPrevent stdin wait for first message from named pipeHow can pipe producer tell pipe consumer it has reached 'End of File'?" (un-named-pipe, not named-pipe)Create Bash Script to Wait and then RunFile system for Pipe DeviceHow to wait for user to close vim then run command in shell scriptRun a command in the background, wait for a particular log line, then run a new command in the foreground






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








4















I tried the following command after watch this video on pipe shenanigans.



man -k . | dmenu -l 20 | awk 'print $1' | xargs -r man -Tpdf | zathura -


It basically prints a list of manpages to dmenu for the user to select one of them, then it uses xargs to run man -Tpdf % (print to stdout a pdf of the manpage git from the xargs' input) and pass the pdf to a pdf reader (zathura).



The problem is that (as you can see in the video) the pdf reader starts even before I select one manpage in dmenu. And if I click Esc and select none, the pdf reader is still open showing no document at all.



How can I make the pdf reader (and any other command in a pipe chain) to only run when its input reach a end-of-file or when it receives an input at all? Or, alternatively, how can I make a pipe chain to stop after one of the chained commands returns a non-zero exit status (so that if dmenu returns an error for not selecting an option, the following commands are not run)?










share|improve this question



















  • 1





    What shell are you using? Is this bash?

    – terdon
    6 hours ago











  • I've tried it on bash, zsh, and sh. All of them had the same behavior.

    – Seninha
    44 mins ago






  • 1





    Yes, the behavior is standard, I asked which shell because of bash's pipefail option mentioned in Kusalandanda's answer.

    – terdon
    40 mins ago

















4















I tried the following command after watch this video on pipe shenanigans.



man -k . | dmenu -l 20 | awk 'print $1' | xargs -r man -Tpdf | zathura -


It basically prints a list of manpages to dmenu for the user to select one of them, then it uses xargs to run man -Tpdf % (print to stdout a pdf of the manpage git from the xargs' input) and pass the pdf to a pdf reader (zathura).



The problem is that (as you can see in the video) the pdf reader starts even before I select one manpage in dmenu. And if I click Esc and select none, the pdf reader is still open showing no document at all.



How can I make the pdf reader (and any other command in a pipe chain) to only run when its input reach a end-of-file or when it receives an input at all? Or, alternatively, how can I make a pipe chain to stop after one of the chained commands returns a non-zero exit status (so that if dmenu returns an error for not selecting an option, the following commands are not run)?










share|improve this question



















  • 1





    What shell are you using? Is this bash?

    – terdon
    6 hours ago











  • I've tried it on bash, zsh, and sh. All of them had the same behavior.

    – Seninha
    44 mins ago






  • 1





    Yes, the behavior is standard, I asked which shell because of bash's pipefail option mentioned in Kusalandanda's answer.

    – terdon
    40 mins ago













4












4








4








I tried the following command after watch this video on pipe shenanigans.



man -k . | dmenu -l 20 | awk 'print $1' | xargs -r man -Tpdf | zathura -


It basically prints a list of manpages to dmenu for the user to select one of them, then it uses xargs to run man -Tpdf % (print to stdout a pdf of the manpage git from the xargs' input) and pass the pdf to a pdf reader (zathura).



The problem is that (as you can see in the video) the pdf reader starts even before I select one manpage in dmenu. And if I click Esc and select none, the pdf reader is still open showing no document at all.



How can I make the pdf reader (and any other command in a pipe chain) to only run when its input reach a end-of-file or when it receives an input at all? Or, alternatively, how can I make a pipe chain to stop after one of the chained commands returns a non-zero exit status (so that if dmenu returns an error for not selecting an option, the following commands are not run)?










share|improve this question
















I tried the following command after watch this video on pipe shenanigans.



man -k . | dmenu -l 20 | awk 'print $1' | xargs -r man -Tpdf | zathura -


It basically prints a list of manpages to dmenu for the user to select one of them, then it uses xargs to run man -Tpdf % (print to stdout a pdf of the manpage git from the xargs' input) and pass the pdf to a pdf reader (zathura).



The problem is that (as you can see in the video) the pdf reader starts even before I select one manpage in dmenu. And if I click Esc and select none, the pdf reader is still open showing no document at all.



How can I make the pdf reader (and any other command in a pipe chain) to only run when its input reach a end-of-file or when it receives an input at all? Or, alternatively, how can I make a pipe chain to stop after one of the chained commands returns a non-zero exit status (so that if dmenu returns an error for not selecting an option, the following commands are not run)?







shell-script scripting pipe






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 9 mins ago







Seninha

















asked 6 hours ago









SeninhaSeninha

398210




398210







  • 1





    What shell are you using? Is this bash?

    – terdon
    6 hours ago











  • I've tried it on bash, zsh, and sh. All of them had the same behavior.

    – Seninha
    44 mins ago






  • 1





    Yes, the behavior is standard, I asked which shell because of bash's pipefail option mentioned in Kusalandanda's answer.

    – terdon
    40 mins ago












  • 1





    What shell are you using? Is this bash?

    – terdon
    6 hours ago











  • I've tried it on bash, zsh, and sh. All of them had the same behavior.

    – Seninha
    44 mins ago






  • 1





    Yes, the behavior is standard, I asked which shell because of bash's pipefail option mentioned in Kusalandanda's answer.

    – terdon
    40 mins ago







1




1





What shell are you using? Is this bash?

– terdon
6 hours ago





What shell are you using? Is this bash?

– terdon
6 hours ago













I've tried it on bash, zsh, and sh. All of them had the same behavior.

– Seninha
44 mins ago





I've tried it on bash, zsh, and sh. All of them had the same behavior.

– Seninha
44 mins ago




1




1





Yes, the behavior is standard, I asked which shell because of bash's pipefail option mentioned in Kusalandanda's answer.

– terdon
40 mins ago





Yes, the behavior is standard, I asked which shell because of bash's pipefail option mentioned in Kusalandanda's answer.

– terdon
40 mins ago










2 Answers
2






active

oldest

votes


















3














All commands in a pipeline starts pretty much at the same time. It's only the I/O over the pipe that synchronises them. Also, a pipe can only hold as much information as the pipe's buffer allows.



You can therefore not avoid running one stage of a pipeline, because



  1. the command in that stage is started as soon as all other stages are started anyway, and

  2. if the command did not consume the input that comes in over the pipe, it would block the previous stages of the pipeline.

Instead, write the output to a file while letting the pipeline finish. Then use that file.



Example (as a function taking one argument):



myman () dmenu -l 20 


This additionally would not run the zathura program if the pipeline failed (the xargs part returned non-zero) or the generated file is empty.



In the bash shell, you would also want to set the pipefail shell option with set -o pipefail to have the pipeline return the exit status of the first command in the pipeline that fails. And you would want to make the tmpfile variable local:



myman () 
local tmpfile=$( mktemp )

if [ -o pipefail ]; then
set -o pipefail
trap 'set +o pipefail' RETURN
fi

if man -k "$1"


This sets the pipefail option for the duration of the function, if it wasn't already set, and then unsets it if needed.






share|improve this answer




















  • 1





    Why rm -f? Are you thinking of cases where the pipe changes the permissions of the tmpfile?

    – terdon
    6 hours ago






  • 2





    @terdon I'm thinking of cases where the temporary file is prematurely removed. rm -f would not error out if the file already was removed (possibly by zathura, I don't know).

    – Kusalananda
    6 hours ago












  • The first function does not work as expected: It will also make zathura show a black window, but now zathura runs after the pipeline finish, rather than running alongside the pipeline. This is because the pipeline returns the exit status of xargs, which is 0. The command that fails in the pipeline is dmenu (which returns 1 when I select nothing). The bash function with the pipefail option works as expected (and in zsh too, which has the same option).

    – Seninha
    16 mins ago












  • @Seninha I fixed the first function by letting it check whether the generated file is non-empty.

    – Kusalananda
    9 mins ago


















2














Pdf files are supposed to be seekable; any pdf viewer will have to look first at the trailer and from there jump to the offsets from the xref table.



Since pipes are not seekable, zathura is using an obfuscating trick, where it's copying all the input to a temporary file, and then use that temporary file as usually. This kind of "clever" trick is creating false hopes and is leading people to assume that pdf files are streamable.



But anyways, zathura really does wait for the EOF before displaying the document, you don't have to do anything for that to hapen:



(sleep 10; cat file.pdf) | zathura -
# will really show the content of file.pdf after 10 seconds


The problem is that zathura has no option to let it only open the window if the file's OK, and exit with an error case if that's not the case -- it will just stay there as if everything's OK:



$ dd if=file.pdf bs=50000 count=1 status=none | zathura -
error: could not open document # its window still hanging around showing nothing

$ echo $?
0 # really?


So even if you're redirecting the output to a temporary file yourself, and are only running zathura with that tempfile if everything went OK, there's no guarantee that the user won't be served with a black window if zathura doesn't like the output for one reason or another.




Btw,



man -X man


will display a manpage in an X11 window with gxditview, even if it looks straight out of the '70 ;-)



And, of course, you could always use:



... | xargs xterm -e man


which, besides many other enhancements, will let you use regular expressions in searches and proper text selection.






share|improve this answer

























    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%2f515862%2fhow-to-make-a-pipeline-wait-for-end-of-file-or-stop-after-an-error%23new-answer', 'question_page');

    );

    Post as a guest















    Required, but never shown

























    2 Answers
    2






    active

    oldest

    votes








    2 Answers
    2






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    3














    All commands in a pipeline starts pretty much at the same time. It's only the I/O over the pipe that synchronises them. Also, a pipe can only hold as much information as the pipe's buffer allows.



    You can therefore not avoid running one stage of a pipeline, because



    1. the command in that stage is started as soon as all other stages are started anyway, and

    2. if the command did not consume the input that comes in over the pipe, it would block the previous stages of the pipeline.

    Instead, write the output to a file while letting the pipeline finish. Then use that file.



    Example (as a function taking one argument):



    myman () dmenu -l 20 


    This additionally would not run the zathura program if the pipeline failed (the xargs part returned non-zero) or the generated file is empty.



    In the bash shell, you would also want to set the pipefail shell option with set -o pipefail to have the pipeline return the exit status of the first command in the pipeline that fails. And you would want to make the tmpfile variable local:



    myman () 
    local tmpfile=$( mktemp )

    if [ -o pipefail ]; then
    set -o pipefail
    trap 'set +o pipefail' RETURN
    fi

    if man -k "$1"


    This sets the pipefail option for the duration of the function, if it wasn't already set, and then unsets it if needed.






    share|improve this answer




















    • 1





      Why rm -f? Are you thinking of cases where the pipe changes the permissions of the tmpfile?

      – terdon
      6 hours ago






    • 2





      @terdon I'm thinking of cases where the temporary file is prematurely removed. rm -f would not error out if the file already was removed (possibly by zathura, I don't know).

      – Kusalananda
      6 hours ago












    • The first function does not work as expected: It will also make zathura show a black window, but now zathura runs after the pipeline finish, rather than running alongside the pipeline. This is because the pipeline returns the exit status of xargs, which is 0. The command that fails in the pipeline is dmenu (which returns 1 when I select nothing). The bash function with the pipefail option works as expected (and in zsh too, which has the same option).

      – Seninha
      16 mins ago












    • @Seninha I fixed the first function by letting it check whether the generated file is non-empty.

      – Kusalananda
      9 mins ago















    3














    All commands in a pipeline starts pretty much at the same time. It's only the I/O over the pipe that synchronises them. Also, a pipe can only hold as much information as the pipe's buffer allows.



    You can therefore not avoid running one stage of a pipeline, because



    1. the command in that stage is started as soon as all other stages are started anyway, and

    2. if the command did not consume the input that comes in over the pipe, it would block the previous stages of the pipeline.

    Instead, write the output to a file while letting the pipeline finish. Then use that file.



    Example (as a function taking one argument):



    myman () dmenu -l 20 


    This additionally would not run the zathura program if the pipeline failed (the xargs part returned non-zero) or the generated file is empty.



    In the bash shell, you would also want to set the pipefail shell option with set -o pipefail to have the pipeline return the exit status of the first command in the pipeline that fails. And you would want to make the tmpfile variable local:



    myman () 
    local tmpfile=$( mktemp )

    if [ -o pipefail ]; then
    set -o pipefail
    trap 'set +o pipefail' RETURN
    fi

    if man -k "$1"


    This sets the pipefail option for the duration of the function, if it wasn't already set, and then unsets it if needed.






    share|improve this answer




















    • 1





      Why rm -f? Are you thinking of cases where the pipe changes the permissions of the tmpfile?

      – terdon
      6 hours ago






    • 2





      @terdon I'm thinking of cases where the temporary file is prematurely removed. rm -f would not error out if the file already was removed (possibly by zathura, I don't know).

      – Kusalananda
      6 hours ago












    • The first function does not work as expected: It will also make zathura show a black window, but now zathura runs after the pipeline finish, rather than running alongside the pipeline. This is because the pipeline returns the exit status of xargs, which is 0. The command that fails in the pipeline is dmenu (which returns 1 when I select nothing). The bash function with the pipefail option works as expected (and in zsh too, which has the same option).

      – Seninha
      16 mins ago












    • @Seninha I fixed the first function by letting it check whether the generated file is non-empty.

      – Kusalananda
      9 mins ago













    3












    3








    3







    All commands in a pipeline starts pretty much at the same time. It's only the I/O over the pipe that synchronises them. Also, a pipe can only hold as much information as the pipe's buffer allows.



    You can therefore not avoid running one stage of a pipeline, because



    1. the command in that stage is started as soon as all other stages are started anyway, and

    2. if the command did not consume the input that comes in over the pipe, it would block the previous stages of the pipeline.

    Instead, write the output to a file while letting the pipeline finish. Then use that file.



    Example (as a function taking one argument):



    myman () dmenu -l 20 


    This additionally would not run the zathura program if the pipeline failed (the xargs part returned non-zero) or the generated file is empty.



    In the bash shell, you would also want to set the pipefail shell option with set -o pipefail to have the pipeline return the exit status of the first command in the pipeline that fails. And you would want to make the tmpfile variable local:



    myman () 
    local tmpfile=$( mktemp )

    if [ -o pipefail ]; then
    set -o pipefail
    trap 'set +o pipefail' RETURN
    fi

    if man -k "$1"


    This sets the pipefail option for the duration of the function, if it wasn't already set, and then unsets it if needed.






    share|improve this answer















    All commands in a pipeline starts pretty much at the same time. It's only the I/O over the pipe that synchronises them. Also, a pipe can only hold as much information as the pipe's buffer allows.



    You can therefore not avoid running one stage of a pipeline, because



    1. the command in that stage is started as soon as all other stages are started anyway, and

    2. if the command did not consume the input that comes in over the pipe, it would block the previous stages of the pipeline.

    Instead, write the output to a file while letting the pipeline finish. Then use that file.



    Example (as a function taking one argument):



    myman () dmenu -l 20 


    This additionally would not run the zathura program if the pipeline failed (the xargs part returned non-zero) or the generated file is empty.



    In the bash shell, you would also want to set the pipefail shell option with set -o pipefail to have the pipeline return the exit status of the first command in the pipeline that fails. And you would want to make the tmpfile variable local:



    myman () 
    local tmpfile=$( mktemp )

    if [ -o pipefail ]; then
    set -o pipefail
    trap 'set +o pipefail' RETURN
    fi

    if man -k "$1"


    This sets the pipefail option for the duration of the function, if it wasn't already set, and then unsets it if needed.







    share|improve this answer














    share|improve this answer



    share|improve this answer








    edited 10 mins ago

























    answered 6 hours ago









    KusalanandaKusalananda

    144k18268448




    144k18268448







    • 1





      Why rm -f? Are you thinking of cases where the pipe changes the permissions of the tmpfile?

      – terdon
      6 hours ago






    • 2





      @terdon I'm thinking of cases where the temporary file is prematurely removed. rm -f would not error out if the file already was removed (possibly by zathura, I don't know).

      – Kusalananda
      6 hours ago












    • The first function does not work as expected: It will also make zathura show a black window, but now zathura runs after the pipeline finish, rather than running alongside the pipeline. This is because the pipeline returns the exit status of xargs, which is 0. The command that fails in the pipeline is dmenu (which returns 1 when I select nothing). The bash function with the pipefail option works as expected (and in zsh too, which has the same option).

      – Seninha
      16 mins ago












    • @Seninha I fixed the first function by letting it check whether the generated file is non-empty.

      – Kusalananda
      9 mins ago












    • 1





      Why rm -f? Are you thinking of cases where the pipe changes the permissions of the tmpfile?

      – terdon
      6 hours ago






    • 2





      @terdon I'm thinking of cases where the temporary file is prematurely removed. rm -f would not error out if the file already was removed (possibly by zathura, I don't know).

      – Kusalananda
      6 hours ago












    • The first function does not work as expected: It will also make zathura show a black window, but now zathura runs after the pipeline finish, rather than running alongside the pipeline. This is because the pipeline returns the exit status of xargs, which is 0. The command that fails in the pipeline is dmenu (which returns 1 when I select nothing). The bash function with the pipefail option works as expected (and in zsh too, which has the same option).

      – Seninha
      16 mins ago












    • @Seninha I fixed the first function by letting it check whether the generated file is non-empty.

      – Kusalananda
      9 mins ago







    1




    1





    Why rm -f? Are you thinking of cases where the pipe changes the permissions of the tmpfile?

    – terdon
    6 hours ago





    Why rm -f? Are you thinking of cases where the pipe changes the permissions of the tmpfile?

    – terdon
    6 hours ago




    2




    2





    @terdon I'm thinking of cases where the temporary file is prematurely removed. rm -f would not error out if the file already was removed (possibly by zathura, I don't know).

    – Kusalananda
    6 hours ago






    @terdon I'm thinking of cases where the temporary file is prematurely removed. rm -f would not error out if the file already was removed (possibly by zathura, I don't know).

    – Kusalananda
    6 hours ago














    The first function does not work as expected: It will also make zathura show a black window, but now zathura runs after the pipeline finish, rather than running alongside the pipeline. This is because the pipeline returns the exit status of xargs, which is 0. The command that fails in the pipeline is dmenu (which returns 1 when I select nothing). The bash function with the pipefail option works as expected (and in zsh too, which has the same option).

    – Seninha
    16 mins ago






    The first function does not work as expected: It will also make zathura show a black window, but now zathura runs after the pipeline finish, rather than running alongside the pipeline. This is because the pipeline returns the exit status of xargs, which is 0. The command that fails in the pipeline is dmenu (which returns 1 when I select nothing). The bash function with the pipefail option works as expected (and in zsh too, which has the same option).

    – Seninha
    16 mins ago














    @Seninha I fixed the first function by letting it check whether the generated file is non-empty.

    – Kusalananda
    9 mins ago





    @Seninha I fixed the first function by letting it check whether the generated file is non-empty.

    – Kusalananda
    9 mins ago













    2














    Pdf files are supposed to be seekable; any pdf viewer will have to look first at the trailer and from there jump to the offsets from the xref table.



    Since pipes are not seekable, zathura is using an obfuscating trick, where it's copying all the input to a temporary file, and then use that temporary file as usually. This kind of "clever" trick is creating false hopes and is leading people to assume that pdf files are streamable.



    But anyways, zathura really does wait for the EOF before displaying the document, you don't have to do anything for that to hapen:



    (sleep 10; cat file.pdf) | zathura -
    # will really show the content of file.pdf after 10 seconds


    The problem is that zathura has no option to let it only open the window if the file's OK, and exit with an error case if that's not the case -- it will just stay there as if everything's OK:



    $ dd if=file.pdf bs=50000 count=1 status=none | zathura -
    error: could not open document # its window still hanging around showing nothing

    $ echo $?
    0 # really?


    So even if you're redirecting the output to a temporary file yourself, and are only running zathura with that tempfile if everything went OK, there's no guarantee that the user won't be served with a black window if zathura doesn't like the output for one reason or another.




    Btw,



    man -X man


    will display a manpage in an X11 window with gxditview, even if it looks straight out of the '70 ;-)



    And, of course, you could always use:



    ... | xargs xterm -e man


    which, besides many other enhancements, will let you use regular expressions in searches and proper text selection.






    share|improve this answer





























      2














      Pdf files are supposed to be seekable; any pdf viewer will have to look first at the trailer and from there jump to the offsets from the xref table.



      Since pipes are not seekable, zathura is using an obfuscating trick, where it's copying all the input to a temporary file, and then use that temporary file as usually. This kind of "clever" trick is creating false hopes and is leading people to assume that pdf files are streamable.



      But anyways, zathura really does wait for the EOF before displaying the document, you don't have to do anything for that to hapen:



      (sleep 10; cat file.pdf) | zathura -
      # will really show the content of file.pdf after 10 seconds


      The problem is that zathura has no option to let it only open the window if the file's OK, and exit with an error case if that's not the case -- it will just stay there as if everything's OK:



      $ dd if=file.pdf bs=50000 count=1 status=none | zathura -
      error: could not open document # its window still hanging around showing nothing

      $ echo $?
      0 # really?


      So even if you're redirecting the output to a temporary file yourself, and are only running zathura with that tempfile if everything went OK, there's no guarantee that the user won't be served with a black window if zathura doesn't like the output for one reason or another.




      Btw,



      man -X man


      will display a manpage in an X11 window with gxditview, even if it looks straight out of the '70 ;-)



      And, of course, you could always use:



      ... | xargs xterm -e man


      which, besides many other enhancements, will let you use regular expressions in searches and proper text selection.






      share|improve this answer



























        2












        2








        2







        Pdf files are supposed to be seekable; any pdf viewer will have to look first at the trailer and from there jump to the offsets from the xref table.



        Since pipes are not seekable, zathura is using an obfuscating trick, where it's copying all the input to a temporary file, and then use that temporary file as usually. This kind of "clever" trick is creating false hopes and is leading people to assume that pdf files are streamable.



        But anyways, zathura really does wait for the EOF before displaying the document, you don't have to do anything for that to hapen:



        (sleep 10; cat file.pdf) | zathura -
        # will really show the content of file.pdf after 10 seconds


        The problem is that zathura has no option to let it only open the window if the file's OK, and exit with an error case if that's not the case -- it will just stay there as if everything's OK:



        $ dd if=file.pdf bs=50000 count=1 status=none | zathura -
        error: could not open document # its window still hanging around showing nothing

        $ echo $?
        0 # really?


        So even if you're redirecting the output to a temporary file yourself, and are only running zathura with that tempfile if everything went OK, there's no guarantee that the user won't be served with a black window if zathura doesn't like the output for one reason or another.




        Btw,



        man -X man


        will display a manpage in an X11 window with gxditview, even if it looks straight out of the '70 ;-)



        And, of course, you could always use:



        ... | xargs xterm -e man


        which, besides many other enhancements, will let you use regular expressions in searches and proper text selection.






        share|improve this answer















        Pdf files are supposed to be seekable; any pdf viewer will have to look first at the trailer and from there jump to the offsets from the xref table.



        Since pipes are not seekable, zathura is using an obfuscating trick, where it's copying all the input to a temporary file, and then use that temporary file as usually. This kind of "clever" trick is creating false hopes and is leading people to assume that pdf files are streamable.



        But anyways, zathura really does wait for the EOF before displaying the document, you don't have to do anything for that to hapen:



        (sleep 10; cat file.pdf) | zathura -
        # will really show the content of file.pdf after 10 seconds


        The problem is that zathura has no option to let it only open the window if the file's OK, and exit with an error case if that's not the case -- it will just stay there as if everything's OK:



        $ dd if=file.pdf bs=50000 count=1 status=none | zathura -
        error: could not open document # its window still hanging around showing nothing

        $ echo $?
        0 # really?


        So even if you're redirecting the output to a temporary file yourself, and are only running zathura with that tempfile if everything went OK, there's no guarantee that the user won't be served with a black window if zathura doesn't like the output for one reason or another.




        Btw,



        man -X man


        will display a manpage in an X11 window with gxditview, even if it looks straight out of the '70 ;-)



        And, of course, you could always use:



        ... | xargs xterm -e man


        which, besides many other enhancements, will let you use regular expressions in searches and proper text selection.







        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited 3 hours ago

























        answered 3 hours ago









        mosvymosvy

        10.9k11340




        10.9k11340



























            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%2f515862%2fhow-to-make-a-pipeline-wait-for-end-of-file-or-stop-after-an-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

            How to create a command for the “strange m” symbol in latex? Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30pm US/Eastern)How do you make your own symbol when Detexify fails?Writing bold small caps with mathpazo packageplus-minus symbol with parenthesis around the minus signGreek character in Beamer document titleHow to create dashed right arrow over symbol?Currency symbol: Turkish LiraDouble prec as a single symbol?Plus Sign Too Big; How to Call adfbullet?Is there a TeX macro for three-legged pi?How do I get my integral-like symbol to align like the integral?How to selectively substitute a letter with another symbol representing the same letterHow do I generate a less than symbol and vertical bar that are the same height?

            Българска екзархия Съдържание История | Български екзарси | Вижте също | Външни препратки | Литература | Бележки | НавигацияУстав за управлението на българската екзархия. Цариград, 1870Слово на Ловешкия митрополит Иларион при откриването на Българския народен събор в Цариград на 23. II. 1870 г.Българската правда и гръцката кривда. От С. М. (= Софийски Мелетий). Цариград, 1872Предстоятели на Българската екзархияПодмененият ВеликденИнформационна агенция „Фокус“Димитър Ризов. Българите в техните исторически, етнографически и политически граници (Атлас съдържащ 40 карти). Berlin, Königliche Hoflithographie, Hof-Buch- und -Steindruckerei Wilhelm Greve, 1917Report of the International Commission to Inquire into the Causes and Conduct of the Balkan Wars

            Category:Tremithousa Media in category "Tremithousa"Navigation menuUpload media34° 49′ 02.7″ N, 32° 26′ 37.32″ EOpenStreetMapGoogle EarthProximityramaReasonatorScholiaStatisticsWikiShootMe