쉘 스크립트에서 별칭을 실행하는 방법은 무엇입니까?


101

mpiexec전체 경로가 인 실행 파일 이 ~/petsc-3.2-p6/petsc-arch/bin/mpiexec있습니다. 전체 경로를 다시 입력하지 않고 다른 디렉토리에서이 명령을 실행하려고하므로 홈 .bashrc파일에 별명을 설정했습니다 .

alias petsc="~/petsc-3.2-p6/petsc-arch/bin/mpiexec"  

다음을 mpiexec입력하여 명령 프롬프트 에서이 파일을 쉽게 실행할 수 있습니다.

petsc myexecutable

script새 별명 petsc을 명령으로 사용하여 라는 이름의 쉘 스크립트 파일을 쓰려고했습니다 . 쉘 스크립트에 적절한 권한을 부여한 후 (을 사용하여 chmod) 스크립트를 실행하려고했습니다. 그러나 다음과 같은 오류가 발생했습니다.

./script: line 1: petsc: command not found

나는 단지의 전체 경로 쓸 수 있음을 알고 mpiexec파일을하지만, 나는 새로운 스크립트를 작성하고자하는 전체 경로 매번 작성하는 번거 롭다. petsc스크립트 파일 내에서 별칭을 사용할 수있는 방법이 있습니까? 편집 .bashrc하거나 .bash_profile이를 수행 할 수있는 방법 이 있습니까?


에 별칭을 추가하는 것은 .bash_aliases어떻습니까? 또한 상대 경로 대신 절대 경로의 별칭을 지정하는 방법에 대해alias petsc='/home/user/petsc-3.2-p6/petsc-arch/bin/mpiexec'
Nitin Venkatesh

@nitstorm : 어느 해결책도 작동하지 않는 것 같습니다 ... 여전히 이전과 같은 오류가 발생합니다
Paul

답변:


74
  1. 쉘 스크립트에서 별명 대신 전체 경로를 사용하십시오.

  2. 쉘 스크립트에서 변수, 다른 구문을 설정하십시오

    petsc='/home/your_user/petsc-3.2-p6/petsc-arch/bin/mpiexec'
    
    $petsc myexecutable
    
  3. 스크립트에서 함수를 사용하십시오. petsc복잡한 경우 아마도 더 나은

    function petsc () {
        command 1
        command 2
    }
    
    petsc myexecutable
    
  4. 별명 소싱

    shopt -s expand_aliases
    source /home/your_user/.bashrc
    

당신은 아마 당신의 소스를 원하지 않기 .bashrc때문에 IMO는 처음 3 개 중 하나가 더 좋을 것입니다.


16
shopt -s expand_aliases동일한 스크립트에서 사용하지 않으면 포인트 4가 작동하지 않습니다 .
enzotib

귀하의 제안 2)는 작동하지만 첫 번째 줄 petsc = "..."를 쓰지 않고도 여러 쉘 스크립트에서 동일한 명령을 사용할 수 있기를 원합니다. 이 방법이 있습니까?
Paul

1
@ enzotib-감사합니다, 나는 그것을 내 대답에 추가했습니다.
Panther

1
포인트 2에서는 별칭이 아니라 변수를 설정합니다.
pabouk '11

1
OP가 요청하지 않았지만 질문 제목과 관련이 있습니다. 포인트 2는을 포함하는 명령에서 작동하지 않습니다 |. 여기에서 사용 shopt -s expand_aliases및 지역 별명, 예를 들어 alias myalias='echo abc|rev'사용하기 전에 줄 바꿈이 필요합니다 (의 별명 참조 man bash). 포인트 4 : 소스 파일은 비 대화식 실행을 방해 할 수 있습니다 (예 : 스크립트). 조기을 찾아 exit또는 return예를 들어, [ -z "$PS1" ] && return(주 프롬프트가 비 대화 형 쉘을 나타내는 설정되지 않은 경우 검사) 또는 수표가있을 수 있습니다 i에서 $-( $-쉘 옵션을 포함, i상호 작용을 의미). man bash해당 변수를 참조하십시오 .
유효한

61

쉘 기능을 위해 별명은 더 이상 사용되지 않습니다. 로부터 bash매뉴얼 페이지 :

For almost every purpose, aliases are superseded by shell functions.

함수를 작성하고 서브 쉘로 내보내려면 다음을 다음에 넣으십시오 ~/.bashrc.

petsc() {
    ~/petsc-3.2-p6/petsc-arch/bin/mpiexec "$@"
}
export -f petsc

그런 다음 스크립트에서 자유롭게 명령을 호출 할 수 있습니다.


그것은 거의 작동합니다 ... 유일한 문제는 실행 가능한 "mpiexec"에 다른 플래그를 전달할 수 있어야한다는 것입니다. 예를 들어, "petsc -n 40 my executable"과 같은 것을 실행할 수 있어야합니다. 별칭 "petsc"
Paul

4
@Paul : "$@"인수를 처리하기 위해 추가했습니다 .
enzotib 2012 년

12

쉘 함수 및 별명은 쉘로 제한되며 실행 된 쉘 스크립트에서 작동하지 않습니다. 귀하의 경우에 대한 대안 :

  • ( mpiexec대신에 사용하지 않아도되는 경우 petsc) 변수에 추가 $HOME/petsc-3.2-p6/petsc-arch/bin하십시오 PATH. 편집 ~/.profile및 추가하여 수행 할 수 있습니다 .

    PATH="$HOME/petsc-3.2-p6/petsc-arch/bin:$PATH"

    변경 사항을 적용하려면 다시 로그인하십시오

  • 디렉토리를 ~/bin만들고

    • 다음을 포함하는 랩퍼 스크립트 petsc를 작성하십시오.

      #!/bin/sh
      exec ~/petsc-3.2-p6/petsc-arch/bin/mpiexec "$@"
      
    • 프로그램이 허용하는 경우 쉘 스크립트를 건너 뛰고 다음 명령을 사용하여 심볼릭 링크를 만들 수 있습니다.

      ln -s ~/petsc-3.2-p6/petsc-arch/bin/mpiexec ~/bin/petsc

9

bash 4에서는 특수 변수를 사용할 수 있습니다 : $BASH_ALIASES.

예를 들면 다음과 같습니다.

$ alias foo="echo test"
$ echo ${BASH_ALIASES[foo]}
echo test
$ echo `${BASH_ALIASES[foo]}` bar
test bar

또는 변수로 정의한 다음 명령 대체 또는를 사용하십시오 eval.

예를 들어 다음과 같은 별칭을 정의하는 대신

alias foo="echo test"

그것을 다음과 같이 정의하십시오 :

foo="echo test"

대신에. 그런 다음 다음 중 하나를 수행하십시오.

find . -type f -exec sh -c "eval $foo" \;

또는:

find . -type f -exec sh -c "echo `$foo`" \;

쉘 기능을 위해 별명은 더 이상 사용되지 않으며,이 답변은 승인해야하는 유일한 것입니다. 이전 데비안 8조차 버전 4의 bash가 있으므로 ${BASH_ALIASES[alias]}좋은 옵션입니다. 그렇지 않으면 다른 것들을 적용하기 위해 .bash_aliases의 많은 줄을 편집해야했습니다. 감사합니다.
erm3nda

8

bash가 -i 플래그를 사용하여 스크립트를 대화식 쉘로 실행하도록 할 수 있습니다. 이것은 .bashrc 파일 에 별명 및 기타 기능을 정의하도록 지시합니다.

예:

~ $ grep ll .bashrc
alias ll='ls -lah'
~ $ cat script.sh 
#!/bin/sh

ll
~ $ bash script.sh 
script.sh: line 3: ll: command not found
~ $ bash -i script.sh
..directory contents..

더 많은 정보:

$ man bash

2
.bashrc또한 비 대화식 SSH 명령 실행 중에 읽습니다 (그래서 맨 위에 대화 형 기능을 검사하는 이유)
muru

6
ALIASES
   ...
   Aliases are not expanded when the shell is not interactive, unless the expand_aliases shell option is set using shopt (see the description of shopt under SHELL BUILTIN COMMANDS
   below).

따라서이 질문에 대한 진정한 대답은 쉘 스크립트에서 실제 별칭을 대신 사용하려는 경우 다음과 같습니다.

#!/bin/bash

shopt -s expand_aliases

alias foo=bar

foo whatever

에 관해서는 나는이 작업을 수행 할 것 : 때문에 특별한 상황에, 나는 그것이 쉘 스크립트의 생각에 Dockerfile 트릭을해야합니다.


4
  1. 에서 .bash_aliases:

    petsc {
    ~/petsc-3.2-p6/petsc-arch/bin/mpiexec "$@"
    }
    

    또는에 기능을 넣으십시오 .bashrc. 일반적으로의 .bashrc구성 설정에만 bash저장됩니다.

  2. 터미널에서 : source .bash_aliases

  3. 불러라: petsc arg(s)

장점 : 당신이 필요하지 않습니다 export -f petsc에서 .bash_aliases. 별명은 더 이상 사용되지 않지만 .bash_aliases함수에 사용 하는 것은 좋습니다.


나는이 솔루션을 좋아한다, 나중에 시도해 볼 것이다
Greenonline

2
  1. 쉘 스크립트에서 별명을 사용하십시오.
  2. 스크립트를 실행하는 대신 현재 대화식 셸에서 스크립트를 작성하십시오.

따라서 script.sh별명 사용을 포함하는 명령으로 호출 된 파일이 있으면 다음을 입력하십시오.

source script.sh

@DavidFoerster 이 방법은 잘 작동합니다. .또는 sourcebuiiltin 으로 스크립트를 소싱 하면 현재 쉘이 모든 명령을 실행합니다. 별명 확장이 .또는 source실행 되는 쉘에서 발생하면 별명 확장이 발생 합니다. 그러나이 방법은 종종 환경에 따라 자체 쉘에서 스크립트를 실행해야 할 필요가 있기 때문에이 방법이 때때로 유용하다는 것을 인식하는 것이 중요합니다. 일반적인 방식으로 실행하려는 의도로 작성된 쉘 스크립트는 일반적으로 대신 소스가되어서는 안되며 종종 제대로 작동하지 않습니다.
Eliah Kagan

@EliahKagan : 감사합니다. 이제 나는 대답이 의미하는 바를 이해합니다. 설명을 추가하겠습니다.
David Foerster

1

(편집 : mpiexec 호출을 잘못 읽었으므로 기능이 제거되었습니다.)

필요한 것이 타이핑을 적게하는 것이라면, 폴더를 $ PATH에 넣지 않겠습니까? 아니면 $ PATH의 일부 폴더에서 mpiexec에 심볼릭 링크를 만드시겠습니까? 또는 (내가 가장 좋아하는) 호출 스크립트에서 소스 스크립트에 별칭을 넣습니까?


1
$ PATH에 넣을 수없는 이유는 $ PATH에 이미있는 다른 디렉토리에 다른 'mpiexec'파일이 있기 때문입니다. 이 새로운 'mpiexec'에 경로를 추가하면 둘 다 실행하려고 시도 할 것입니다.
Paul

1
왜 단순히 사용하지 않는지 이해할 수 없습니다 "$@".
enzotib 2012 년

2
Paul, PATH에서 처음 인 것을 실행하려고 시도 할 것입니다.
unhammer

enzotib, 아, 나는 mpiexec가 호출 된 방식을 잘못 읽었습니다. 나는 모든 인수가 하나로 필요하다고 생각했습니다. 내 답변을 편집합니다 :)
unhammer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.