일련의 별칭이 있는 것이 있습니다 .bash_profile
. 현재 이러한 별칭은 단일 명령만 실행하며 매우 간단합니다. 그러나 만들려는 새 별칭으로 수행하고 싶은 두 가지 작업이 있습니다.
- CD를 디렉토리로
- 이 디렉터리에서 명령을 실행하세요.
답변1
특정 작업 디렉토리를 사용하여 명령을 실행하려면 일반적으로 다음을 수행합니다.
( cd directory && utility )
양쪽의 괄호는 cd ...
내부 명령이 하위 쉘에서 실행된다는 것을 나타냅니다. 서브셸에서 작업 디렉터리를 변경하면 호출 셸의 현재 작업 디렉터리가 변경되지 않고 유지됩니다. 즉, 이 명령을 호출한 후에도 시작했을 때와 동일한 디렉터리에 있습니다.
예:
( cd / && echo "$PWD" ) # will output "/"
echo "$PWD" # will output whatever directory you were in at the start
별칭은 어떤 매개 변수도 허용할 수 없으므로 범용 별칭으로 전환할 수 없습니다.
하나를 위해특정한다음을 수행할 수 있는 디렉토리 및 유틸리티
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
alias <name-of-the-alias>='cd <the-directory> && <command>'
/var/log/
따라서 디렉터리(cd)를 해당 폴더로 변경한 다음 해당 파일을 나열(ls) 하려면 .bash_profile
파일에 다음을 추가합니다.
alias logs='cd /var/log/ && ls'
답변3
이 함수를 사용하여 다른 디렉터리에서 단일 명령을 실행합니다.
cd1 () {
if [ $# -eq 1 ]; then
command cd -- "$1"
else
( command cd -- "$1" && shift && "$@" )
fi
}
이 기능의 한 가지 제한 사항은 명령이 실행되는 디렉터리가 아닌 원래 디렉터리를 기준으로 와일드카드가 수행된다는 것입니다.zsh가 더 잘할 수 있어요.
단일 인수로 호출하면 함수는 일반 함수처럼 동작하므로 cd
호출해야 할 수도 있습니다 cd
. (이 기능은 옵션을 지원하지 않으나 cd
옵션은 거의 사용되지 않습니다.)
답변4
예를 들어 다음과 같이 명령을 세미콜론으로 구분합니다.
alias do_something='cd /tmp; ls'