디렉토리를 인수로 사용하여 하나의 명령을 실행 한 다음 동일한 것으로 cd하는 방법은 무엇입니까? “그러한 파일이나 디렉토리가 없습니다”


15

다음을 수행하기 위해 짧은 함수를 구성하고 싶습니다. 'file.tex'파일을 내 문서 디렉토리로 이동한다고 가정 해 봅시다.

mv file.tex ~/Documents

그런 다음 cd해당 디렉토리 로 가고 싶습니다 .

cd ~/Documents

이 작업을 모든 디렉토리에 일반화하고 싶습니다.

mv file.tex ~/Documents
follow

그리고이 follow명령은 그에 따라 실행 이전 명령에서 대상을 읽습니다. 간단한 디렉토리의 경우 시간이 많이 걸리지 않지만 중첩 된 디렉토리로 작업 할 때 그냥 사용할 수 있다는 것은 엄청난 일입니다

mv file.tex ~/Documents/folder1/subfolder1
follow

나는 그것이 상대적으로 간단하다고 생각하고 다음과 같이 할 수 있다고 생각했다.

follow()
{
    place=`history 2 | sed -n '1p;1q' | rev | cut -d ' ' -f1 | rev`
    cd $place
}

그러나 이것은 작동하지 않는 것 같습니다. echo $place이면 원하는 문자열을 얻지 만 (테스트하고 있습니다 ~/Documents) 마지막 명령은

No such file or directory

디렉토리가 반드시 존재합니다. 나는 길을 잃었다. 당신이 나를 도울 수 있습니까?


file.tex원래 위치를 유지하는 데 신경 쓰지 않으면 symlinks 는 한 번만 링크하면 항상 최신 버전을 가리 키기 때문에 매우 좋은 대안 이라고 지적하고 싶습니다 .
Kroltan

5
더 쉬운 방법 : 이전 명령의 마지막 토큰을 대체하려면 cd alt + .를 입력 하십시오. 최종 토큰의 역사에서 다시 돌아가려면 반복하십시오. ( 최종 토큰으로 가져 foo &오기 때문에 토큰이 인수되지 않습니다 &.) 숫자 인수를 사용할 수 있습니다 (예 : escape-3 alt +.).
Peter Cordes


답변:


18

함수를 정의하는 대신을 사용 $_하여 이전 명령의 마지막 인수로 확장 된 변수를 사용할 수 있습니다 bash. 따라서 다음을 사용하십시오.

cd "$_"

mv명령 후 .

히스토리 확장도 사용할 수 있습니다.

cd !:$

기능을 사용해야하는 경우 :

follow () { cd "$_" ;}

$ follow () { cd "$_" ;}
$ mv foo.sh 'foo bar'
$ follow 
foo bar$ 

주의 : 이 답변은 위치 매개 변수를 처리 할 때 사용한 정확한 명령 줄 인수 형식을 대상으로합니다. 예를 들어 mv -t foo bar.txt, 다른 형식의 경우 특정 검사를 미리 통합해야하므로 래퍼가 적합합니다.


역사 확장 (cd! : $)은 완벽하게 작동합니다. 감사합니다. 그러나 다른 (cd "$ _")는 다음을 수행하지 않습니다. mv file.tex ~ / Downloads / cd "$ _"bash : cd : __bp_preexec_invoke_exec : 해당 파일 또는 디렉토리가 없습니다. 감사합니다.
화재

나는 항상 ( cd !$또는 다소 낭비 적)을 입력했다 cd $(dirname !$). $_변수 에 대해 몰랐습니다 !
Kalvin Lee

이제 내가 mv -t ~/Documents file.tex대신에 mv file.tex ~/Documents어떻게됩니까? 결론적으로, 이것이 일반적인 경우에 해결할 수 있는지 확신 할 수 없습니다 ... 래퍼 함수 주위에 또는 재 구현 mv이 더 나을 수도 있습니다 ...
CVn

@ MichaelKjörling은 간단하게 작동하지 않을 것입니다 ..이 예는 OP (가장자리가 아닌 모든 경우)가 아닌 경우를 다루기위한 것입니다.
heemayl

콜론이 필요하지 않습니다. 입력 !$하는 것과 같습니다 !:$.
와일드 카드

14

표준 bash 키 바인딩을 사용하면 조합 Alt.은 이전 명령 행의 마지막 인수를 현재 명령 행에 복사합니다. 입력

$ mv foo ~/some/long/path/
$ cd <Alt><.>

얻을 것이다

$ mv foo ~/some/long/path/
$ cd ~/some/long/path/

단어보다 타이핑이 훨씬 적습니다 follow.

편의성을 높이기 위해 Alt.조합을 반복하면 모든 이전 명령 줄의 마지막 인수를 탐색합니다.

부록 : 이 키 조합에 해당하는 bash 명령 이름은 yank-last-arg또는 insert-last-argument입니다. bash 맨 페이지 "히스토리 조작 명령"또는보다 철저한 Bash Reference Manual 에서 찾을 수 있습니다 .)


1
영리 해요 감사! 나는 이것이 존재하는지 전혀 몰랐다.
화재

@Fire 해당 명령에 대한 참조를 추가 했으므로 훨씬 더 흥미로운 키 바인딩을 찾을 수 있습니다 (항상처럼 항상 다시 잊어 버립니다).
Dubu

1
또한 <esc>다음 .과 같은 결과를 얻을 수 있습니다 <alt>+..이 기능은
캡스 락

1
@ gnur vi (m) 사용자라고 생각합니다. ;-)
Dubu

6

간결한 예제로 설명 할 수있는 매개 변수 확장 전에 물결 확장이 발생한다는 문제는 거의 확실합니다.

$ cd ~kaz
kaz $ var='~kaz'
kaz $ echo $var
~kaz
kaz $ cd $kaz
bash: cd: ~kaz: No such file or directory

이 문제는로 해결할 수 있습니다 eval. 어쨌든, 당신은 eval기록에서 명령을 가져오고 다음과 같이 임의의 확장을 포함 할 수 있기 때문에 필요 합니다.

$ mv file.tex ~/Documents/$(compute_folder_name foo-param)/subfolder1
$ follow

(이러한 값의 재 확장이 원래의 확장과 더 이상 일치하지 않는 등의 문제가 있습니다. compute_folder_name일부 전역 변수를 증가시키는 함수 라고 가정 하십시오.)


4
당신은 필요하지 않습니다 eval. (Ever.) 그러나 확장 시퀀스 문제에 대한 좋은 발견. eval여기에서 사용하는 역사 확장의 더 큰 권고를 언급한다면 , 이것이 내 의견으로는 가장 좋은 대답이 될 것입니다. 다른 사람들은 실제로 Original Poster의 솔루션이 작동하지 않은 이유를 설명하지 않습니다 .
와일드 카드
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.