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.

Tim
  • 101,790

2 Answers2

7

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.

Stephen Kitt
  • 434,908
6
$ 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