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
コマンドでも同様のことが適用できる。
以上。