bash 별칭이 명령 포함과 함께 작동하도록 만드는 방법(예: $()(달러 기호 및 대괄호))

bash 별칭이 명령 포함과 함께 작동하도록 만드는 방법(예: $()(달러 기호 및 대괄호))

나는 한때 다음과 같은 별명을 가지고 있었습니다.

alias mount-open="sudo mount $(sudo blkid | gawk '/2tb-open/ { print substr($1, 0, 9) }') 2tb-open"

100% 동일하다고 확신할 수는 없지만 100% bash 함수가 아닌 bash 별칭이며 변수 등을 사용하지 않고 다른 명령이 포함되어 있습니다.

이제 이 작업을 수행할 수 없습니다. 예제에서처럼 큰따옴표를 넣으면 터미널이 시작될 때 일부 sudo 명령을 실행하려고 시도합니다. 작은 따옴표를 사용하고 중간 따옴표를 이스케이프 처리하는 경우:

alias mount-open='sudo mount $(sudo blkid | gawk \'/2tb-open/ { print substr($1, 0, 9) }\') 2tb-open'

그것은 말한다:

bash: .bashrc: line 25: syntax error near unexpected token `('

나는 이것이 Fedora에 비해 상당히 간결한 기본 Ubuntu bashrc의 "추가 코드"와 관련이 있다고 생각합니다. 내 말은, 우분투에서 작동한다는 거죠. 몇 년 전에 Fedora를 설치하고 Ubuntu 시스템에서 bashrc 파일을 복사했는데 별칭 등이 제대로 작동했습니다. 일주일 전에는 Fedora 32(Ubuntu bashrc 사용)에서 작동했습니다. 하지만 이제 내 데이터가 손실되었으므로 이를 "재창조"하려고 합니다. 현재 저는 기본 Fedora bashrc 파일을 사용하고 있는데 처음에는 15줄만 있습니다.

누구든지 이 문제를 해결하는 방법을 제안할 수 있습니까?

감사해요.

답변1

함수나 스크립트를 사용하는 것이 더 쉽습니다.

mount-open() {
  sudo mount "$(
      sudo blkid |
        gawk '/2tb-open/ { print substr($1, 0, 9) }'
    )" 2tb-open
}

하지만 라벨이 있는 장치를 설치하려는 경우 2tb-open,

mount-open() { sudo mount LABEL=2tb-open 2tb-open; }

그 정도면 충분합니다.

답변2

작은따옴표로 묶인 문자열 내에서는 작은따옴표를 이스케이프할 수 없습니다. 큰따옴표를 종료하고 나중에 다시 입력해야 합니다.

alias mount-open='sudo mount $(sudo blkid | gawk '\''/2tb-open/ { print substr($1, 0, 9) }'\'') 2tb-open'

관련 정보