내 작업 흐름의 일부로 나는 ll
( alias ll='ls -l'
) 필요한 파일이 거기에 있는지 확인하기 위해 디렉터리로 이동한 다음, cd
내가 해야 할 일을 수행하기 위해 동일한 디렉터리로 이동하는 경향이 있습니다.
!!
또는 와 동일한 기능을 사용할 수 있도록 하는 별칭(또는 bash 함수)을 추가하고 싶습니다 sudo !!
. 즉, 를 입력하고 해당 디렉토리에서 처리하려는 파일을 찾은 경우 가상의 별칭을 실행하면 이전 명령이 변경되도록(또는 이와 유사한 것) 입력 하기 를 ll /mnt/Disc1/somedir
원합니다. 절대/상대 경로를 지정하고 실행 명령을 se로 바꾸면 이제 이전 위치가 아닌 디렉터리 에 있게 됩니다 .cd !!
cd !!
ll
cd
/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 쉘 동작
- 인용문에 설명된 인용 규칙에 따라 입력을 단어와 연산자로 나눕니다. 이러한 태그는 메타 문자로 구분됩니다. 이 단계를 통해 Alias 확장이 수행됩니다(Aliases 참조).
위의 진술을 감안할 때 별칭에서 기록 확장이 가능한지 모르겠습니다. 함수는 필요한 모든 유연성을 제공합니다.
lcd() {
local ans
ll "$1"
read -rp "cd there? [Y/n] " ans
if [[ ${ans,,} != n* ]]; then
cd "$1"
fi
}
기능의 사용자 인터페이스를 취향에 맞게 조정하세요.