개행 문자를 보존하면서 이 모든 것을 xclip에 "파이프"하려면 어떻게 해야 합니까?

개행 문자를 보존하면서 이 모든 것을 xclip에 "파이프"하려면 어떻게 해야 합니까?

그래서 저는 버그를 보고할 때 시스템 정보를 얻기 위해 이 편리한 작은 명령을 만들었습니다.

alias clip="xclip -selection clipboard -in"
alias bug="echo $(lsb_release -irs && uname -r && free --human --giga) | clip"

문제는 두 가지입니다. 이 작업을 수행하지 않으면 echo $()모든 명령에 대한 표준 출력이 캡처되지 않고 마지막 명령만 캡처됩니다. 그러나 그렇게 하면 개행 문자가 제거되어 읽기가 훨씬 어려워집니다.

또한 $()별칭을 실제로 실행하면 이렇게 되지만 bug별칭 없이 직접 명령을 실행하면 그렇지 않다는 것을 알았습니다.

❯ bug                                                                                                                           # IdeaProjects
Fedora 33
zsh: 5.11.7-200.fc33.x86_64: command not found...
zsh: 10:20:16: command not found...
zsh: total: command not found...
zsh: Mem:: command not found...
zsh: Swap:: command not found...

대신 대화식 쉘에서 실행하십시오.

❯ echo $(lsb_release -irs && uname -r && uptime && free --human --giga) | clip                                                  # IdeaProjects

❯ Fedora 33 5.11.7-200.fc33.x86_64 10:39:11 up 3 days, 20:44, 1 user, load average: 0.70, 1.02, 0.97 total used free shared buff/cache available Mem: 15G 5.9G 2.3G 1.8G 7.6G 7.8G Swap: 12G 72M 11G

왜 다를지 이해가 안 되네요.

어떻게 단일 별칭/명령으로 작성하고(이 경우 함수가 허용될 수 있다고 생각합니까 zsh?) 개행 문자를 보존하려면 어떻게 해야 합니까?

PS 보고서 개선에 대한 제안사항이 있으시면 언제든지 댓글로 남겨주세요.

답변1

서브쉘을 사용하세요:

alias bug="(lsb_release -irs && uname -r && free --human --giga) | clip"

clip이는 공백을 처리하지 않고 세 가지 명령 모두의 표준 출력을 로 보냅니다 .

두 별칭을 결합할 수 있습니다.

alias bug="(lsb_release -irs && uname -r && free --human --giga) | xclip -selection clipboard -in"

free출력을 너무 일찍 형식화 하지 않을 것입니다 . 반올림하면 혼란이 발생할 수 있습니다.

alias bug="(lsb_release -irs && uname -r && free) | xclip -selection clipboard -in"

별칭에서 발생하는 문제는 bug별칭을 정의할 때 명령 대체가 평가된다는 사실에서 비롯됩니다 alias.

$ alias
...
bug=$'echo Fedora 33\n5.11.7-200.fc33.x86_64\n              total        used        free      shared  buff/cache   available\n ...

따라서 별칭은 별칭이 됩니다.

echo Fedora 33
5.11.7-200.fc33.x86_64
total used free shared buff/cache available
...

이는 인용한 결과를 얻는 이유를 설명합니다. 이 명령은 다시 평가되지 않기 때문에 별칭을 통하지 않고 직접 실행할 때 작동합니다. 확장은 $(lsb_release ...)에 대한 인수로 제공되며 echo, 이는 있는 그대로 출력됩니다(셸에서 공백을 처리한 후).

인용이 중요하다:

대체 항목을 큰따옴표로 묶지 않은 경우 인수는 출력을 단어로 나누는 데 사용됩니다 IFS.

따라서 alias bug="echo $(lsb_release ...)"개행 문자가 보존되어 별칭을 실행할 때 여러 명령이 생성되지만 echo $(lsb_release ...)그렇지 않습니다(어쨌든 명령이 재해석되지 않으므로 이는 중요하지 않습니다).

관련 정보