
긴 파이프를 작성할 때 일반적으로 두 줄로 구분하는 것이 더 명확합니다.
이 긴 명령줄은 다음과 같습니다.
ruby -run -e httpd -- -p 5000 . 2>&1 | tee >(grep -Fq 'WEBrick::HTTPServer#start' && open localhost:5000)
다음과 같이 나눌 수 있습니다.
ruby -run -e httpd -- -p 5000 . 2>&1 \
| tee >(grep -Fq 'WEBrick::HTTPServer#start' && open localhost:5000)
또는:
ruby -run -e httpd -- -p 5000 . 2>&1 |
tee >(grep -Fq 'WEBrick::HTTPServer#start' && open localhost:5000)
간단히 말해서:
command1 \
| command2
또는:
command1 |
command2
이것이 스타일(의견) 문제일 수 있다는 것을 알고 있지만, 선호하는 방법이 있습니까? 그렇다면 그 이유는 무엇입니까?
답변1
이것이 무엇을 할 것인지 스스로에게 물어보세요.
command1 \
| command2
차이점을 볼 수 없습니다. 나도 마찬가지지만 쉘은 할 수 있다. 자세히 보시면 뒤에 공백이 있습니다 \
. 이렇게 하면 개행 문자가 이스케이프되는 것을 방지할 수 있습니다.
따라서 더 안전한 다른 형식을 사용하십시오. 여기에는 동일한 오류가 표시됩니다( |
이 경우에는 뒤에 공백이 있음). 하지만 버그가 발생하지는 않습니다.
command1 |
command2
답변2
나는 여기 있는 대부분의 사람들의 의견에 동의하지 않을 것입니다. 나는 항상 포장하는 것을 선호한다~ 전에파이프와 같은 결합 연산자:
command1 \
| command 2
(두 번째 줄을 들여쓸 필요는 없습니다. 파이프 자체가 이를 첫 번째 줄과 매우 명확하게 연결합니다.)
이에 대한 몇 가지 이유가 있습니다:
보기가 더 쉬워요결합자; 라인의 디테일 사이에서 길을 잃지 않습니다. (줄이 길고 결합자가 눈에 띄지 않게 스크롤되거나 줄 바꿈 사이에서 손실되었을 수 있는 경우 특히 중요합니다.) 코드를 빠르게 스캔하면 왼쪽을 내려다볼 수 있습니다. is: 들여쓰기, 중괄호 또는 특정 언어에서 사용하는 모든 것. 파이프와 기타 조이너는 구조에 중요하므로 이들 역시 왼쪽에 있어야 합니다.
줄지어 서 있다3개 이상의 줄에 걸쳐 있는 경우. 다시 말하지만, 이는 파이프라인의 구조를 한눈에 파악하기 쉽게 만듭니다.
우리가 생각하는 방식에 더 가깝습니다. (이것이 가장 미묘하고 논쟁의 여지가 있는 점입니다…) 누군가가 적을 수 있도록 목록을 천천히 읽는다면 “[항목 1]…(정지시키다)…그리고 [항목 2]…(정지시키다)… 그리고 [항목 3].”; “[항목 1] 그리고…(정지시키다)… [항목 2] 그리고…(정지시키다)… [항목 3].” 왜냐하면 우리는 조이너를 이전 것보다 다음 항목에 더 많이 붙이는 것으로 생각하기 때문입니다. (산술에서 빼기 기호도 비슷한 의미로 생각할 수 있습니다. 덧셈처럼 작동하지만 부정하면 다음 숫자와 더 밀접하게 연결됩니다.) 코드는 우리의 생각을 반영할 때 따라가기가 더 쉽습니다.
나는 수년에 걸쳐 여러 언어로 두 가지 방법을 모두 시도했으며 다음 줄에 조이너를 배치하는 것이 대부분의 경우 실제로 도움이 된다는 것을 발견했습니다.
답변3
글쎄, 아무도 선호하지 않는 것처럼 보이지 않도록 하려면 다음을 수행하십시오.
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
답변4
나는 이에 대한 대답이 쉽다고 생각했지만 @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