여러 개의 따옴표가 있는 Bash 별칭

여러 개의 따옴표가 있는 Bash 별칭

내 작업 흐름의 일부로 나는 ll( alias ll='ls -l') 필요한 파일이 거기에 있는지 확인하기 위해 디렉터리로 이동한 다음, cd내가 해야 할 일을 수행하기 위해 동일한 디렉터리로 이동하는 경향이 있습니다.

!!또는 와 동일한 기능을 사용할 수 있도록 하는 별칭(또는 bash 함수)을 추가하고 싶습니다 sudo !!. 즉, 를 입력하고 해당 디렉토리에서 처리하려는 파일을 찾은 경우 가상의 별칭을 실행하면 이전 명령이 변경되도록(또는 이와 유사한 것) 입력 하기 를 ll /mnt/Disc1/somedir원합니다. 절대/상대 경로를 지정하고 실행 명령을 se로 바꾸면 이제 이전 위치가 아닌 디렉터리 에 있게 됩니다 .cd !!cd !!llcd/mnt/Disc1/somedir

다음과 같은이 답변, 나는 작동하는 버전을 얻었습니다.

cd "$(echo !-1 | awk '{print $2}')"

터미널에서 실행하면 정확히 내가 원하는 작업이 수행됩니다( echo !-1기록의 마지막 명령을 인쇄합니다. 즉, ll /mnt/Disc1/somedir파이핑 awk '{print $2}'후 두 번째 열을 인쇄합니다 . 즉 /mnt/Disc1/somedir, 이것이 명령의 매개변수/매개변수가 됩니다 cd).

내 문제는 이 명령에 대한 별칭을 정의하는 것입니다.

기능

내가 본 대부분의 답변은 함수를 솔루션으로 사용하는 것을 제안합니다(예를 들어 여기), 하지만이 답변, 기능 섹션 이후에 사용하는 것이 좋습니다문자 그대로의 인용문. 잠시 동안 나는 이것이 내 문제를 해결할 것이라고 생각했지만 작동시킬 수 없습니다. 함수에 대한 주요 문제점은 !-1함수에 대한 인수로 경로를 명시적으로 입력하지 않고도 해당 부분이 작동하도록 하는 방법을 찾을 수 없다는 것입니다 .

인용 탈출

내가 읽은 것 중에서 (주로이것그리고이것), 나는 따옴표를 이스케이프 처리하는 올바른 방법을 이해할 수 있다면 내가 원하는 별칭의 작동하는 버전을 가질 수 있을 것이라고 믿습니다. 내가 찾은 답변의 문제점은 따옴표(또는 특수 기호)를 이스케이프하는 올바른 방법을 설명하지 않으며 이를 수행하는 방법을 배울 수 있는 좋은 참고 자료도 제시하지 않는다는 것입니다(이와 같이 많은 예를 제공했지만 올바른 방법을 배우기에는 설명이 충분하지 않았습니다.). 그들은 단지 당면한 상황에 맞춰 일하거나 내가 내 상황에 적응할 수 없는 것에 대한 예를 제시할 뿐입니다.

{print $2}대안으로 (awk 대신) cut 명령을 사용하여 해당 부분 주위의 작은따옴표를 둘러보려고 했습니다 . 하지만 상상할 수 있듯이 다른 구분 기호를 정의하려면 따옴표를 사용해야 합니다...

편집하다 지적한대로이 답변에서, 저는 이 문제를 잘못된 방법으로 해결하려고 합니다. 가능한 해결책은 @frabjous 주석을 참조하세요.

답변1

이와 함께 -- 이전 명령의 마지막 매개변수가 !!있습니다 .!$

ll /some/dir
cd !$

바라보다9.3 역사적 확장설명서에


별칭으로 사용하십시오. 링크된 매뉴얼 섹션에 다음과 같이 나와 있습니다.

전체 라인을 읽은 직후, 쉘이 이를 단어로 나누기 전에 히스토리 확장을 수행합니다.

그런 다음 별칭은 다음에 설명된 대로 대체됩니다.3.1.1 쉘 동작

  1. 인용문에 설명된 인용 규칙에 따라 입력을 단어와 연산자로 나눕니다. 이러한 태그는 메타 문자로 구분됩니다. 이 단계를 통해 Alias ​​확장이 수행됩니다(Aliases 참조).

위의 진술을 감안할 때 별칭에서 기록 확장이 가능한지 모르겠습니다. 함수는 필요한 모든 유연성을 제공합니다.

lcd() {
    local ans
    ll "$1"
    read -rp "cd there? [Y/n] " ans
    if [[ ${ans,,} != n* ]]; then
        cd "$1"
    fi
}

기능의 사용자 인터페이스를 취향에 맞게 조정하세요.

관련 정보