함수를 만들고 aptget
소스를 제공했습니다.
$ type aptget
aptget is a function
aptget ()
{
sudo apt-get install -y $@
}
다음은 스크립트의 처음 몇 줄입니다 build.sh
.
#!/bin/bash
sudo apt remove -y x264 libx264-dev
#aptget build-essential checkinstall cmake pkg-config yasm
aptget git gfortran
aptget libjpeg8-dev libjasper-dev libpng12-dev
aptget libtiff5-dev
aptget libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev
aptget libxine2-dev libv4l-dev
bash 스크립트 내부 를 사용하려고 할 때 aptget
찾을 수 없습니까?
아마도 여기에 간단한 내용이 누락되었을 수도 있습니다. 이것은 에 있습니다 ubuntu 18.04
. 팁을 주셔서 감사합니다.
답변1
일반적으로 쉘 함수는 자신이 정의된 쉘 외부에서 사용되지 않습니다.이 답변맞습니다. 그러나 Bash에서는당신은 이것을 할 수 있습니다:
export -f aptget
그런 다음 전화하면 build.sh
기능을 알아야 합니다. 이는 통역사가 이라는 사실에 의존합니다 bash
. 일반적으로 다른 쉘에서는 이 기능을 볼 수 없습니다. 다른 인터프리터를 사용하도록 스크립트를 다시 작성하면 aptget
스크립트 내에서 호출하는 기능이 손실될 가능성이 높습니다 .
일반 참고 사항: 스크립트 이름이 이미 오해의 소지가 있으므로 해석기가 sh
. 스크립트가 커져서 다시 작성해야 한다고 결정했다고 가정해 보겠습니다 python
. 이름을 변경하지 않고 이 작업을 수행하고 싶을 수도 있습니다. 왜냐하면 다른 스크립트에서 (분명히 이전 이름을 통해) 이 이름을 사용할 수도 있기 때문입니다. 그러므로 build.sh
좋은 이름은 아닙니다. build
아마도.
표준적인 방법은 이름이 지정된 스크립트를 생성하여 사용자가 가리키는 aptget
디렉터리에 배치하는 것입니다 . PATH
스크립트는 함수가 수행하는 작업을 수행해야 합니다. 일부 함수는 스크립트로 대체할 수 없지만(예: 호출 셸의 변수를 조작하려는 경우) 특정 함수는 가능합니다. 스크립트를 생성한 후에는 함수 자체가 필요하지 않습니다.
그런 다음 aptget
다른 스크립트에서 호출하면 제대로 작동합니다.
답변2
쉘 함수는 서브쉘로 내보내지지 않습니다. build.sh가 현재 셸 인스턴스에 정의된 셸 함수에 액세스할 수 있도록 하려면 현재 인스턴스에서 실행되도록 소스를 지정해야 합니다. 정상적으로 호출하면 새 쉘 인스턴스가 실행되어 실행되며 해당 새 하위 쉘은 현재 쉘 인스턴스의 쉘 기능에 액세스할 수 없습니다.