Bash 파일이 자체적으로 수정되지 않도록 제외

Bash 파일이 자체적으로 수정되지 않도록 제외

나는 내 스크립트를 "완벽하게" 만드는 방법을 배우고 있습니다. 현재 폴더의 파일을 수정하는 일부 스크립트가 있지만 스크립트 자체도 수정합니다. 나는 이 모든 것이 "for" 루프와 내가 알아낼 수 없는 "찾기"로 귀결된다는 것을 알고 있습니다.

for f in $(find . -type f | grep -v $0)

내 목표는 현재 디렉터리와 하위 디렉터리에서 찾을 수 있는 모든 파일을 포함하되 실행된 스크립트 자체는 제외하는 것입니다. grep -v와 함께 작동하지만 이제는 스크립트 이름이 포함된 모든 파일(예: 하위 폴더의 스크립트 복사본)을 제외합니다. 실행된 스크립트에서만 작동하도록 하는 방법을 아는 사람이 있습니까? 누군가가 어느 시점에서 이름을 변경할 수 있다고 가정해야 하므로 수동으로 제외하는 것은 불가능합니다.

답변1

이 방법의 예 find . -type f ! -path $0. 스크립트가 foo.sh보고하는 방식에 유의하세요."디"목차. foo.sh현재 디렉터리에 없습니다 .

$ find . -print
.
./a
./b
./c
./foo.sh
./d
./d/foo.sh
$ cat foo.sh
#!/bin/bash
for f in $(find . -type f ! -path $0); do
echo $f
done
$ ./foo.sh
./a
./b
./c
./d/foo.sh
$

아니면 시도해 보세요for f in $(find . -type f | grep -v "^\./foo\.sh$"); do

답변2

무엇이 잘못됐나요:

for f in $(find . -type f); do
 case $f in 
  */$0|$0)
     continue
  ;;
  *)
     echo 'Do something'
  ;;
 esac
 fi
done 

관련 정보