0

From https://unix.stackexchange.com/a/156010/674

Note that the second sh above goes into the inline script's $0. You should use something relevant there (like sh or find-sh), not things like _, -, -- or the empty string as that is used for the shell's error messages:

$ find . -name accept_ra -exec sh -c 'echo 0 > "$1"' inline-sh {} \;
inline-sh: ./accept_ra: Permission denied

What does "_, -, -- or the empty string is used for the shell's error messages" mean?

Why does using inline-sh not work in the example, given that inline-sh is not _, -, -- or the empty string?

Thanks.

6

The subject of “is used for the shell’s error messages” is “$0”, not “_, -, -- or the empty string”. The value given to $0 is used for error messages; so you shouldn’t specify a meaningless value for $0, otherwise you’ll end up with weird error messages. It might make more sense as

Note that the second sh above goes into the inline script's $0. You should use something relevant there (like sh or find-sh), not things like _, -, -- or the empty string, as the value in $0 is used for the shell's error messages:

inline-sh does work in the example: it’s used in the error message, which is the whole point of the example.

  • 1
    Thanks for that better wording. I've now updated my answer there with that. – Stéphane Chazelas Jun 8 '18 at 13:29
  • @Stéphane you’re welcome! I hesitated to edit your answer directly, but I didn’t since it would have changed this question ;-). – Stephen Kitt Jun 8 '18 at 13:37
7
$ find . -name accept_ra -exec sh -c 'echo 0 > "$1"' inline-sh {} \;
inline-sh: ./accept_ra: Permission denied

The error message tells you it's an inline-sh that fails to open a ./accept_ra file.

$ find . -name accept_ra -exec sh -c 'echo 0 > "$1"' _ {} \;
_: ./accept_ra: Permission denied
$ find . -name accept_ra -exec sh -c 'echo 0 > "$1"' '' {} \;
: ./accept_ra: Permission denied

Makes it less obvious and more confusing to the user what is actually failing to open that ./accept_ra.

Hence the recommendation to use a meaningful value for that first argument after sh -c 'code'. Repeating the command name is generally just fine. As in

sh -c 'code using "$@"' sh  actual arguments to the inline script

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.