나는 wsl bash를 사용하고 있으며 내 파일 ~/.bashrc
에 다음 함수가 정의되어 있습니다 .
function clip { /mnt/c/Windows/System32/clip.exe "${@%\n}"; }
\n
그러나 매개변수의 후행은 제거되지 않습니다. 내 특정 요구 사항을 충족하기 위해 어떻게 개선할 수 있나요?
매우 감사합니다
편집 : 도움으로카밀그 대답을 통해 나는 정확히 무슨 일이 일어나고 있는지 알아낼 수 있었습니다. 생성된 하위 프로세스(cmd.exe)가 삽입되고 있던 캐리지 리턴을 추가하고 있었던 것으로 나타났습니다 clip.exe
(Pipes.ex.를 사용하고 있었기 때문입니다 pwd | clip
).
다음을 통해 원하는 결과를 얻을 수 있었습니다.
function clip { /mnt/c/Windows/System32/WindowsPowershell/v1.0/powershell.exe Set-Clipboard "${@:-$(cat)}"; }
의존하기 때문에 조금 느립니다.
- 전원 공급 장치 하우징
- cat (외부 바이너리는 내장 읽기로 대체되어야 함)
하지만 내 요구에 따르면 이것은 문제가 되지 않습니다. :)
답변1
"${@%\n}"
n
후행 문자 (개행 문자가 아닌 리터럴 문자열) 가 제거 "${@%\\n}"
됩니다 .\n
줄바꿈을 제거하려면 줄바꿈을 전달해야 합니다. Bash에서는 다음 구문이 작동합니다.
"${@%$'\n'}"
어디$'\n'
실제 개행 생성을 담당합니다. 리터럴 개행도 작동합니다:
"${@%
}"
노트:
- 이 솔루션은 마지막 매개변수뿐만 아니라 모든 매개변수에서 후행 개행 문자를 제거합니다(이것이
$@
작동 방식이기 때문입니다). - Linux에서는 명령줄 인수의 후행 줄 바꿈이 일반적이지 않습니다. 저는 WSL도 모르고 귀하의 사용 사례도 모릅니다. * 원하는 것이 무엇인지 알기를 바랍니다 .
예:
$ set a $'b\n' c
$ printf '<%s>\n' "$@"
<a>
<b
>
<c>
$ printf '<%s>\n' "${@%$'\n'}"
<a>
<b>
<c>
$ printf '<%s>\n' "${@%
}"
<a>
<b>
<c>
\n
* "매개변수에서 후행 제거"가 원하는 것이 아닌 경우아마도(소스?) 스크립트에서 함수를 호출하면 스크립트는 DOS 줄 끝의 영향을 받습니다. 확인하다이 문제.