재귀적으로 파일을 찾기 위해 이 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"
바라보다:인용하다