rm -f 이후에도 파일이 삭제되지 않도록 방지

rm -f 이후에도 파일이 삭제되지 않도록 방지

저는 보통 StackOverflow에 머물지만 이 주제에 대해서는 여러분이 더 전문가라고 생각합니다.

그래서 오늘의 연습문제가 이상해서 하나 작성 script.sh하고 최선을 다해서 test.txt지워지지 않게 해야 하는데 문제는 마지막 줄입니다가지다~이 되다

rm -f test.txt

저는 쉘에 대해 잘 모르기 때문에(보통 C/Objective-C를 사용합니다) 책을 집어 들었지만 아직 다 읽지 않았고 어떻게 해야 할지 모르겠습니다.

권한에 대해 생각했지만 스크립트를 테스트하면 모든 권한이 부여되므로 옵션이 아닙니다 ... (이것이 중요한지는 모르겠지만 스크립트는 OS X에서 실행됩니다).

답변1

Linux에서는 immutable 플래그를 사용하여 chattr파일 시스템 수준의 읽기 전용을 달성할 수 있습니다(단, 적절한 권한이 필요함). 나는 OS를 사용 하지 test.txt않습니다

#!/bin/sh
mv test.txt test.bak
trap "mv test.bak test.txt" EXIT

rm -f test.txt

test.txt스크립트 이름 은 으로 바뀌고 , 스크립트가 종료되면 test.bak다시 이름이 변경됩니다( 이후 ). rm -f test.txt이것은 실제로 읽기 전용은 아니지만 kill -KILL스크립트를 사용하지 않는 한 최소한 데이터를 보존해야 합니다.

또 다른 생각은, 거기에 그 줄을 추가하겠다고 고집한다면, 더 일찍 그만두는 것이 어떻겠습니까?

#!/bin/sh
# do your thing
exit
# my boss insisted to have the 'rm' line below.

rm -f test.txt

rm아무것도 하지 않는 함수가 되는 것의 대안:

#!/bin/sh
# do your thing
rm() {
    # this function does absolutely nothing
    : # ... but it has to contain something
}

rm -f test.txt

위의 함수 접근 방식과 유사하지만 더 이상 사용되지 않는 명령을 사용하여 아무 작업 도 수행하지 않지만 실제 종료 코드를 반환하는 내장 명령의 alias별칭을 지정합니다 .rmtrue

#!/bin/sh
# do your thing
alias rm=true

rm -f test.txt

환경에서 제거하는 대안 ( 내장된 rm것이 없다고 가정 ):rm

#!/bin/sh
# do your thing
PATH= # now all programs are gone, mwuahaha

# gives error: bash: rm: No such file or directory
rm -f test.txt

이를 변경하는 또 다른 방법 은 $PATH스텁 rm프로그램(검색 경로로 사용됨 )을 사용하는 것입니다./tmp

#!/bin/sh
# do your thing
>/tmp/rm # create an empty "rm" file
chmod +x /tmp/rm
PATH=/tmp

rm -f test.txt

내장된 기능에 대한 자세한 내용을 보려면 실행하여 help <built-in>자세히 알아보세요. 예를 들어:

true: true
    Return a successful result.

    Exit Status:
    Always succeeds.

다른 명령의 경우 man rm매뉴얼 페이지를 사용하거나 확인하세요 man bash.

답변2

파일을 삭제하려면 파일이 포함된 디렉터리에 대한 쓰기 권한이 필요합니다.

$ chmod -w .
$ rm -f test.txt
rm: cannot remove `test.txt': Permission denied

예를 들어, 다음 명령을 사용하면 쉽게 복원할 수 있지만 홈 디렉터리에 대한 쓰기 권한을 제거하고 싶지는 않을 것입니다.chmod +w .

관련 정보