Вы можете использовать приведенную ниже команду в соответствии с вашими потребностями
sed -i s/#1520325239/$(date -d @1520325239)/g.bash_history
Спросите себя, что бы это сделало?
command1 \
| command2
Не вижу разницы. Я тоже не могу, а оболочка может. Посмотрите внимательно, после \
есть пробел. Это предотвращает экранирование новой строки.
Поэтому используйте другую форму, так как она безопаснее. Здесь показано с той же ошибкой (пробел после |
в данном случае ). Но это не вызывает ошибки.
command1 |
command2
Ну, просто чтобы это не выглядело так, как будто никому не нравится:
command1 \
| command2
Я собираюсь сказать, что да.
Я считаю, что проблема с конечным пробелом, возникающая при нажатии ctrl -alt -delor, не является -проблемой. Редакторы могут предупредить об этом; git предупреждает об этом. В довершение всего оболочка выдавала синтаксическую ошибку | command2
, предоставляя пользователю файл и номер строки с ошибкой и прекращая интерпретировать остальную часть файла :
$ cat f.sh
#!/bin/bash
echo foo \
| command2
echo bar
$./f.sh
foo
./f.sh: line 4: syntax error near unexpected token `|'
./f.sh: line 4: `| command2'
Существует также тот факт, что есть больше применений для экранирования продолжения строки -. Например, чтобы сломать простые команды с большим количеством аргументов:
ffmpeg \
-f x11grab \
-video_size "$size" \
-framerate "${framerate:-10}" \
-i "${DISPLAY}${offset}" \
-c:v ffvhuff \
-f matroska \
-
Должны ли мы также избегать такого использования, потому что мы не можем быть уверены, что не поставим пробел после побега?
Мое предпочтение зависит исключительно от удобочитаемости и весьма субъективно. Вот реальный -пример из моей истории оболочки (с деталями, замененными на foobar):
org-table-to-csv foobar.org \
| cq +H -q "
select foo
from t
where bar = 'baz'
and foo != ''" \
| sed -r 's/^|$/'\''/g' \
| sed -r ':b;$!{N;bb};s/\n/, /g'
Сравните с:
org-table-to-csv foobar.org |
cq +H -q "
select foo
from t
where bar = 'baz'
and foo != ''" |
sed -r 's/^|$/'\''/g' |
sed -r ':b;$!{N;bb};s/\n/, /g'
Вот ещё:
sed 's/.*//' <<< "$blame_out"
| sort \
| uniq \
| tee >(sed "s/^/from pipe before grep filtering: /" > /dev/tty) \
| grep -vF "$(git show -s --format=%h "$from_commit")" \
| tee >(sed "s/^/from pipe before git show: /" > /dev/tty) \
| xargs git show -s --format='%cI %h' \
| tee >(sed "s/^/from pipe after git show: /" > /dev/tty) \
| sort -k1 \
| tail -1 \
| cut -d' ' -f2
Сравните с:
sed 's/.*//' <<< "$blame_out"
sort |
uniq |
tee >(sed "s/^/from pipe before grep filtering: /" > /dev/tty) |
grep -vF "$(git show -s --format=%h "$from_commit")" |
tee >(sed "s/^/from pipe before git show: /" > /dev/tty) |
xargs git show -s --format='%cI %h' |
tee >(sed "s/^/from pipe after git show: /" > /dev/tty) |
sort -k1 |
tail -1 |
cut -d' ' -f2
Я думал, что ответить на этот вопрос легко, но вижу, что @JoL и @gidds не согласны со мной.
My brain prefers reading a line and not having to scan the next line \
:
foo bar baz............................................. \
In the above I will have to see \
, what is on line 2 \
, before I can tell \
, what the command does \
. Maybe the command is complete \
? Or maybe the command continues \
on the next line \
?
To me it is much easier to read,
if \ is only used,
when a command cannot fit on a line.
Читая свой код, я также вижу в комментариях проблему:
foo........................ |
# Now this does bar
bar........................ ||
# And if that fails: fubar
fubar
Я не уверен, как вы вообще будете делать комментарии в середине конвейера, если вы используете \
+ новую строку перед |
или ||
или &&
. Если это невозможно, я думаю, что это самая важная проблема. Код невозможно поддерживать без комментариев, а комментарии обычно должны быть как можно ближе к коду, чтобы способствовать обновлению документации при изменении кода.
Emacs автоматически делает отступ за меня, так что отступ даже не является дополнительной нагрузкой:
# This is indented automatically in emacs
ruby -run -e httpd -- -p 5000. 2>&1 |
# Send the output to the screen and to grep
tee >(grep -Fq 'WEBrick::HTTPServer#start' &&
# If grep matches, open localhost:5000
open localhost:5000)
# Here is where emacs indents the next command to