Bash의 마지막 매개변수에서 개행 문자를 제거하는 방법은 무엇입니까?

Bash의 마지막 매개변수에서 개행 문자를 제거하는 방법은 무엇입니까?

나는 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 줄 끝의 영향을 받습니다. 확인하다이 문제.

관련 정보