Linux 環境で cp コマンドを使ってファイルを上書きしようとしたときに -f オプションを付けても警告が出る時がある。
以下の通り、実験してみる。環境は、CentOS 7.7 であり、シェルは Bash である。
まず、ファイルを 2 つ作成する。
# echo "aaa" > a.txt
# echo "bbb" > b.txt
何もオプションを付けずに cp コマンドを実行すると警告が出る。
# cp a.txt b.txt
cp: overwrite ‘b.txt’? n
-f または、--force オプションを付けて cp コマンドを実行しても警告が出る。
# cp -f a.txt b.txt
cp: overwrite ‘b.txt’? n
#
この警告は、一般ユーザで実行したときには発生しないが、roor アカウントで操作しているときに発生するはずである。
原因は、デフォルトの alias の違いにある。
まず、一般ユーザで alias コマンドを実行した結果がこれである。
$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .*'
alias la='ls -la --color'
alias ll='ls -l --color'
alias ls='ls --color'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
次に、root ユーザで alias コマンドを実行した結果がこれである。
# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
一般ユーザの結果と root ユーザの結果を比較すると、唯一の違いがこの cp -i という alias である。
alias cp='cp -i'
man cp コマンドの文章を引用すると -i オプションの説明は以下の通りである。
-i, --interactive
prompt before overwrite (overrides a previous -n option)
これはつまり、root ユーザで cp コマンドを実行する際には、明示的に -i オプションを付けなくても、-i オプションが付与されているということである。そして、-i オプションは、常に上書き時に警告を出すのである。
そこで、この alias が付与されている環境下で上書きの警告を出さないようにしたいときはどうすればよいのかというと、cp コマンドの前にバックスラッシュを付与すればよいのである。
# \cp a.txt b.txt
#
今度は何も警告が出なかった。root ユーザなので本来 -f オプションを付ける必要もない。
# cat a.txt
aaa
# cat b.txt
aaa
ファイル b.txt の中身が書き換わっている。
ちなみに、このコマンドの先頭にバックスラッシュをつけるという方法は、alias を無効にするための方法であるため cp コマンド以外の全てのコマンドで適用可能である。先ほど提示した alias を例に取ると、mv コマンドや rm コマンドでも同様のことが適用できる。
以上。