이것GNU Coreutils 매뉴얼mv
설명하다:
-f --force Do not prompt the user before removing a destination file.
그러나 이는 이미 기본 동작으로 설정되어 있으므로 mv
이 -f
옵션은 중복되는 것 같습니다. 예를 들어 GNU Bash 버전 4.3.11에서는 다음과 같습니다.
$ ls -l
total 0
$ touch 1 2; mv -f 1 2; ls
2
$ touch 1 2; mv 1 2; ls
2
이 플래그의 의도가 를 -f
재정의하는 것이 아닌 것 같습니다 alias mv="mv -i"
.여러 가지 표준 방법별칭을 재정의하면(예: 사용 \mv
) 이 작업을 명령 전체에서 더 간결하고 일관된 방식으로 수행할 수 있습니다.
매뉴얼에는 "여러 개의 -i, -f, -n 옵션을 지정하면 마지막 옵션만 적용됩니다"라고 명시되어 있지만 플래그를 사용하는 것만으로도 일반적으로 플래그를 재정의 -f
하려는 의도는 아닌 것 같습니다. 를 사용하는 것보다 더 간결하고 이해하기 쉬운 -i
동등한 동작을 달성합니다 .mv
mv -if
그렇다면 -f
깃발의 목적은 무엇입니까? 왜 존재합니까?
답변1
의 사용법은 -f
다음 항목에 더 명확하게 설명되어 있습니다.매뉴얼 페이지-f
4BSD부터 및 옵션이 추가되었습니다 -i
.
만약에파일 2이미 존재하며 이전에 삭제되었습니다.파일 1만졌다. 만약에파일 2쓰기 비활성화 모드가 있습니다. mv는 모드를 인쇄하고 표준 입력을 읽어서 줄을 얻습니다. 줄이 y로 시작하면 이동이 발생하고 그렇지 않으면 mv가 종료됩니다.
옵션:
-i
대화형 모드를 나타냅니다. 이동으로 인해 기존 파일이 대체될 때마다 사용자에게 파일 이름을 묻는 메시지가 표시되고 그 뒤에 물음표가 표시됩니다. 그가 "y"로 시작하는 줄에 응답하면 이동이 계속됩니다. 다른 응답을 하면 이동이 발생하지 않습니다.
-f
힘을 나타냅니다. 이 옵션은 모든 모드 제한이나-i
스위치를 무시합니다.
mv 작동 방식에 대한 보다 정확한 정의는 다음과 같습니다.POSIX 표준, -f
나중에 명령줄에 나타나는 경우에만 덮어쓰게 됩니다.-i
따라서 기본 동작은 동일합니다 -f
. 기본적으로 대상에 쓸 수 없는 경우에만 확인이 요청됩니다. (이 동작은 적어도V4, mv
옵션이 사용되지 않습니다. ) -i
옵션이 주어지면 mv는 대상이 존재하는 한 추가로 확인을 요청합니다. 이 -f
옵션은 두 경우 모두에서 요청을 비활성화합니다(모든 이후에 발생하는 경우 -i
).
답변2
mv
합리적인 기본값으로 실행을 설정할 때 유용합니다.
alias mv="mv -i"
강제로 이동하려는 경우에 작동합니다.
mv -f
확장 명령의 마지막 옵션이기 때문입니다.
mv -i -f
이 내용은 기사에도 언급되어 있습니다GNU Coreutils 매뉴얼.
답변3
man mv
( ) 때문에 존재한다 .
-i
-f
, , 을 여러 개 지정 하면-n
마지막 항목만 적용됩니다.
따라서 항상 묻는 스크립트/별칭/함수를 가질 수 있지만 여전히 옵션을 재정의할 수 있습니다.
# alias
alias mv='mv -i'
# function
MV () { mv -i "$@" ; }
# script
#!/bin/bash
mv -i "$@"
물론 의미 있는 함수/스크립트는 로그 작업과 같은 더 많은 작업을 수행합니다.
답변4
쉘 프로그래밍에서 -f를 사용하는 것은 명령이 오류로 인해 중단되거나 특정 명령을 실행할 때 스크립트/사용자의 대화형 응답이 필요하지 않도록 하기 위한 일반적인 관용구입니다. 마지막으로 원하는 것은 스크립트가 사용자 입력을 기다리는 것을 멈추는 것입니다. 더 나쁜 것은 잘못된 명령이 표준 입력에서 입력을 받는 것입니다.
노트:별칭을 실행 취소하면 부작용이 발생/제거될 수 있습니다. 명령에 다른 버전의 별칭을 지정했거나 다른 옵션을 사용한 경우 별칭을 실행 취소하면 원치 않는 부작용이 발생할 수 있습니다. 예를 들어 재활용 jar(또는 기타 보호/추적 시스템)을 사용하기 위한 별칭 설정에 mv 및 rm을 사용할 수 있습니다. 별칭을 취소하면 이 문제가 발생합니다...