태그 보관물: scripts

scripts

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

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이를 수행 할 수있는 방법 이 있습니까?



답변

  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 개 중 하나가 더 좋을 것입니다.


답변

쉘 기능을 위해 별명은 더 이상 사용되지 않습니다. 로부터 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) 변수에 추가 $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

답변

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`" \;


답변

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


답변

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 트릭을해야합니다.


답변

  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함수에 사용 하는 것은 좋습니다.