Что означает «` _`, `-`,` –` или пустая строка используется для сообщений об ошибках оболочки »?

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

Обратите внимание, что второй sh выше входит во встроенный скрипт $0 . Там вы должны использовать что-то подходящее (например, sh или find-sh ), а не такие, как _ , - , -- или пустую строку, как это используется для сообщений об ошибках оболочки:

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

Что означает « _ , - , -- или пустая строка используется для сообщений об ошибках оболочки»?

Почему использование inline-sh не работает в этом примере, учитывая, что inline-sh не является _ , - , -- или пустой строкой?

Благодарю.

Тема «используется для сообщений об ошибках оболочки» – это « $0 », а не « _ , - , -- или пустая строка». Значение, данное $0 , используется для сообщений об ошибках; поэтому вы не должны указывать бессмысленное значение для $0 , иначе вы получите странные сообщения об ошибках. Это может иметь больше смысла, как

Обратите внимание, что второй sh выше входит во встроенный скрипт $0 . Вам следует использовать что-то подходящее (например, sh или find-sh ), а не такие, как _ , - , -- или пустую строку, так как значение в $0 используется для сообщений об ошибках оболочки:

inline-sh работает в этом примере: он используется в сообщении об ошибке, которое и составляет весь смысл примера.

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

Сообщение об ошибке говорит вам, что это inline-sh который не может открыть файл ./accept_ra .

 $ 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 

Делает это менее очевидным и более запутанным для пользователя, что на самом деле не может открыть это ./accept_ra .

Следовательно, рекомендуется использовать значимое значение для этого первого аргумента после sh -c 'code' . Повторять имя команды обычно просто отлично. Как в

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