Предпочтительный синтаксис для двухстрочного длинного канала

Вы можете использовать приведенную ниже команду в соответствии с вашими потребностями

sed -i s/#1520325239/$(date -d @1520325239)/g.bash_history
19
08.04.2020, 07:39
3 ответа

Спросите себя, что бы это сделало?

command1 \ 
   | command2

Не вижу разницы. Я тоже не могу, а оболочка может. Посмотрите внимательно, после \есть пробел. Это предотвращает экранирование новой строки.

Поэтому используйте другую форму, так как она безопаснее. Здесь показано с той же ошибкой (пробел после |в данном случае ). Но это не вызывает ошибки.

command1 | 
    command2
41
28.04.2021, 23:18

Ну, просто чтобы это не выглядело так, как будто никому не нравится:

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
10
28.04.2021, 23:18

Я думал, что ответить на этот вопрос легко, но вижу, что @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
7
28.04.2021, 23:18

Теги

Похожие вопросы