bash 기능은 명령줄과 다르게 작동합니다.

bash 기능은 명령줄과 다르게 작동합니다.

재귀적으로 파일을 찾기 위해 이 bash 함수를 만들었습니다.

ff() {
    find . -type f -name '$1'
}

그러나 결과가 반환되지 않습니다. 명령줄에서 직접 명령을 실행하면 결과가 나타납니다. 왜 아래와 같이 다르게 동작하는지 잘 모르겠습니다.

mattr@kiva-mattr:~/src/protocol$ ff *.so
mattr@kiva-mattr:~/src/protocol$ find . -type f -name '*.so' 
./identity_wallet_service/resources/libindystrgpostgres.so

내 기능이 예상대로 작동하지 않는 이유는 무엇입니까? 저는 MacOS와 bash 쉘을 사용하고 있습니다.

고마워요 매트

답변1

문제는 '$1'의 정의에 작은따옴표를 사용하여 실제로 이름이 문자 그대로인 파일을 찾기 위해 ff실행 중이라는 것입니다 .find$1

큰따옴표를 사용하면 이 문제를 해결할 수 있습니다.

ff() {
    find . -type f -name "$1"
}

또한 현재 디렉터리에 지정된 파일이 있는 경우 셸에 의해 확장되는 ff따옴표 없이 파일을 전달하기 때문에 호출에 문제가 있습니다 .*.so*.so

예를 들어 다음은 실패합니다.

mattr@kiva-mattr:~/src/protocol$ touch bogusname.so
mattr@kiva-mattr:~/src/protocol$ ff *.so

검색만 bogusname.so하고 찾지 않습니다 libindystrgpostgres.so.

이 문제를 해결하려면 함수를 *.so호출할 ff때 큰따옴표나 작은따옴표를 사용해야 합니다.

mattr@kiva-mattr:~/src/protocol$ ff '*.so'

또는 다음도 유효합니다.

mattr@kiva-mattr:~/src/protocol$ ff "*.so"

답변2

변수는 작은따옴표 내에서 확장되지 않습니다. 큰따옴표로 묶어야 합니다.

ff() {
    find . -type f -name "$1"
}

텍스트 문자열을 검색 중입니다.$1


*참고: 또한 확장되지 않도록 명령줄 인수를 인용해야 합니다 pwd.

ff "*.so"

바라보다:인용하다

관련 정보