디렉토리의 CD에 대한 별명 및 명령 호출


21

나는 .bash_profile가명을 가지고 있습니다. 현재 이러한 별칭은 단일 명령 만 실행하며 매우 쉽습니다. 그러나 나는 만들려고하는 새로운 별칭으로 두 가지 일을하고 싶습니다.

  1. 디렉토리에 CD
  2. 해당 디렉토리에서 명령을 실행하십시오.

답변:


26

특정 작업 디렉토리로 명령을 실행하려면 일반적으로

( cd directory && utility )

괄호 안의 cd ...의미는 명령이 서브 쉘에서 실행됨을 의미합니다. 서브 쉘에서 작업 디렉토리를 변경하면 호출 쉘의 현재 작업 디렉토리가 변경되지 않습니다. 즉,이 명령을 호출 한 후에도 시작한 동일한 디렉토리에 여전히 있습니다.

예:

( cd / && echo "$PWD" )  # will output "/"
echo "$PWD"              # will output whatever directory you were in at the start

별명은 인수를 사용할 수 없으므로 일반 별명으로 전환 할 수 없습니다.

A에 대한 특정의 디렉토리와 유틸리티, 하나는 할 수

alias cdrun='( cd "$HOME/somedir" && ./script.sh )'

그러나 일반적인 경우에는 셸 함수를 사용해야합니다.

cdrun () {
    ( cd "$1" && shift && command "$@" )
}

또는

cdrun () (
    cd "$1" && shift && command "$@"
)

중괄호를 함수 본문 주위의 괄호로 바꾸면 함수가 자체 서브 쉘에서 실행됩니다.

이것은 다음과 같이 사용됩니다

$ cdrun "$HOME/somedir" ./script.sh

이는 스크립트 실행됩니다 script.sh디렉토리에 위치를 $HOME/somedir함께 $HOME/somedir작업 디렉토리로, 또는

$ cdrun / ls -l

루트 디렉토리의 "긴 형식"으로 된 디렉토리 목록을 제공합니다.

쉘 함수는 첫 번째 인수를 취하여 해당 디렉토리로 변경하려고 시도합니다. 작동하면 디렉토리 이름을 위치 매개 변수 (명령 행 인수 목록)에서 벗어나 나머지 인수가 제공하는 명령을 실행합니다. command쉘에 내장 된 명령으로 단순히 인수를 명령으로 실행합니다.


변경된 작업 디렉토리로 명령을 실행하려면이 모든 것이 필요합니다 . 다른 곳에서 명령을 실행하려면 분명히 사용할 수 있습니다.

alias thing='$HOME/somedir/script.sh'

하지만이 실행됩니다 script.sh에 위치한 $HOME/somedir현재 작업 디렉토리와 같은 디렉토리입니다.

작업 디렉토리를 변경하지 않고 다른 곳에 위치한 스크립트를 실행하는 또 다른 방법은 스크립트의 위치를 PATH환경 변수 에 추가하는 것입니다.

PATH="$PATH:$HOME/somedir"

이제는 다음 script.sh$HOME/somedir사용하여 어디에서나 실행할 수 있습니다.

$ script.sh

이 명령의 작업 디렉토리는 변경 되지 않습니다 .


2
훌륭하고 포괄적 인 답변. 방금 함수 정의에는 명령을 그룹화하는 방법이 하나만 필요하며 하위 셸의 괄호로 충분하다고 언급했습니다 cdrun () ( cd "$1" && shift && command "$@" ).
Anthony G-Monica에 대한 정의

2
@AnthonyGeoghegan 아, 맞습니다. 나는 항상 { ... }더 긴 기능과 일관성을 유지 하기 위해 사용 합니다.
Kusalananda

이 Q & A는 내 상황에 대해 이야기하는 것처럼 보이며 주변 환경을 사용 pushd하고 popd( > /dev/null출력 메시지도 피하려고하는 경우에도) 컨텍스트를 깨끗하게 유지하면서 개선 될 수 있습니다 !
Pysis

1
@Pysis 예, (cd dir && thing)훨씬 더 휴대용 사용하는 것보다 pushd하고 popd.
Kusalananda

@Kusalananda 정말요? 나는 적어도 여러 시스템에서 작동하도록했습니다.
Pysis

4
alias <name-of-the-alias>='cd <the-directory> && <command>'

따라서 디렉토리 (cd)를 폴더로 변경 /var/log/하고 파일을 나열 (ls)하려는 경우 파일에 다음을 추가 할 수 있습니다 .bash_profile.

alias logs='cd /var/log/ && ls'

1

이 기능을 사용하여 다른 디렉토리에서 단일 명령을 실행합니다.

cd1 () {
  if [ $# -eq 1 ]; then
    command cd -- "$1"
  else
    ( command cd -- "$1" && shift && "$@" )
  fi
}

이 기능의 제한 사항은 와일드 카드가 명령이 실행되는 디렉토리가 아닌 원래 디렉토리를 기준으로 완료된다는 것입니다. zsh에서 더 잘 수행 할 수 있습니다 .

이 함수는 cd단일 인수로 호출 하면 일반처럼 작동 하므로 호출 할 수 cd있습니다. 이 기능은 옵션을 지원하지 않지만 cd거의 사용되지 않는 옵션 입니다.


-1

세미콜론으로 명령을 구분하십시오 (예 :

alias do_something='cd /tmp; ls'

8
(가) 경우 cd실패, 잘못된 디렉토리의 디렉토리 목록을 얻을 것입니다. 여기 &&대신 사용 하는 것이 좋습니다 ;.
Kusalananda

@ Kusalananda가 맞습니다. 이 답변
nikolas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.