Вы можете избежать использования расширений с букмарклетами. Букмарклет - это закладка браузера, которая на самом деле не открывает веб-страницу, а выполняет фрагмент Javascript. Букмарклеты используют javascript:
псевдопротокол.
Например, создайте закладку с этим URL:
javascript:(function() 2>/dev/null; echo_and_restore "Command failed!"
и как вы уже догадались, echo_and_restore
исполняется всегда, безоговорочно. Учитывая, что set +x
часть не выполнялась, это означает, что содержимое этой функции также будет напечатано.
Изменение последнего, ;
чтобы &&
не сработало, потому что в Bash, ||
и &&
являются левоассоциативные .
Я нашел модификацию, которая работает для этого варианта использования:
echo_and_restore() { echo "$(cat -)" case "$save_flags" in (*x*) set -x esac } alias echo='({ save_flags="$-"; set +x; } 2>/dev/null; echo_and_restore) <<<'
Он использует подоболочку ( (...)
часть), чтобы сгруппировать все команды, а затем передает входную строку через stdin как Here String ( <<<
вещь), которая затем печатается cat -
. Опция -
необязательна, но вы знаете, « явное лучше, чем неявное ».
Вы также можете использовать cat -
напрямую без echo, но мне нравится этот способ, потому что он позволяет мне добавлять любые другие строки в вывод. Например, я склонен использовать это так:
BASENAME="$(basename "$0")" # Complete file name ... echo "[$] $(cat -)"
И теперь это работает прекрасно:
false || echo "Command failed" > [test.sh] Command failed