저는 보통 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
별칭을 지정합니다 .rm
true
#!/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 .