.bashrc 의이 줄로 인해 Bash가 느리게 시작됩니다. 무엇이 이것을 일으킬 수 있습니까?


19

.bashrc파일에는이 효과에 대한 줄이 포함되어 있습니다.

alias prog="/path/to/script.sh $(find $(pwd) -name prog)"

이 줄을 주석 처리하면 새 터미널을 열 때 Bash가 거의 즉시 시작됩니다. 이 줄을 사용하면 커서가 표시되기까지 4-5 초의 지연이 있습니다.

중첩 된 명령 $(pwd)등을 제거하면 속도가 다시 빨라집니다. 왜 이런 일이 발생합니까? 어떻게 든 중첩 된 명령을 계속 사용할 수 있습니까?


4
문제는 find명령인데, 부팅시 실행되며 디렉토리 구조에 따라 실행하는 데 시간이 오래 걸릴 수 있습니다. 큰 따옴표 대신 작은 따옴표를 사용 find하면 alias호출 시 런타임에 실행 됩니다. 사용하려는 작업 디렉토리, 선언시 또는 런타임에 현재 사용중인 디렉토리에 따라 다릅니다. 그런데 $(pwd)오히려 비효율적 표현하는 방법 .또는 $PWD.
AFH

15
나는 그것이 당신이 요구하는 것이 아니라는 것을 알고 있지만 이것은 XY 문제 와 매우 비슷합니다 . find?를 사용하여 스크립트를 찾아야하는 이유는 무엇 입니까? 일단 설치하면 어디에 있는지 알 수 있습니다. 자주 업데이트하고 이름을 변경하더라도 고정 된 이름으로 항상 사용할 수 있도록 심볼릭 링크를 유지할 수 있습니다.
sleske

5
@AFH 댓글이 아닌 답변으로 답변을 게시하십시오.
David Richerby

1
@DavidRicherby-게시하기 전에 이것이 실제로 답변인지 확인하고 싶었습니다. 스크립트가 임의의 디렉토리에있는 파일에서 작동한다고 당황했습니다.
AFH

답변:


45

명령 대체는 큰 따옴표 안에 있으므로 명령이 정의 될 때 평가됩니다. 이 발생 find하면서 하드 디스크 내용을보고 .bashrc실행됩니다.

대조적으로, 당신은 사용시 평가를 원하는 것처럼 보입니다. 이 경우 작은 따옴표를 사용하십시오.

alias prog='/path/to/script.sh $(find "$(pwd)" -name prog)'

발견 된 파일 중 파일 이름에 공백이 있으면이 별명은 실패합니다. 이를 피하려면

alias prog='find . -name prog -exec /path/to/script.sh {} +'

후자의 형식은 모든 종류의 파일 이름에 안정적으로 작동합니다.


1
'사용 시간'. 그리고 두 번째 줄은 서브 쉘을 생성하지 않습니다.
rleir

11
단점에, 지금은 사용자가 입력 할 때마다 prog, find이전 반면에, 그것은 (쉘 시작에) 한 번만 실행됩니다, 실행해야합니다.
el.pescado

그런 다음 파일 캐싱으로 인해 두 번째로 동일 find하게 실행할 때 일반적으로 훨씬 빠릅니다.
reinierpost

21
@ el.pescado 거꾸로, 의도 된 동작은 사용자가 파일을 처리하기 위해 명령을 실행할 때 존재하는 파일이 아니라 사용자가 로그인 할 당시 존재했던 파일에서 명령을 실행하는 것이라고 상상하기 어렵습니다.
David Richerby

2
@DavidRicherby 어쩌면 이전 경로가 더 이상 존재하지 않으면 경로를 캐시 prog하고 다시 실행할 find수 있습니까?
Alex Vong
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.