cpコマンド実行時の上書き確認の小ネタです。
cpコマンドでオプションに-rfとか指定して、フォルダを丸ごと上書きしようとします。
ところがfオプションを指定しているのにも関わらず、上書き確認してくるときがあり、大変煩わしいときがあります。
数ファイルならあきらめるけれど、対象のファイルが10とか100とかあったら大変。
そんな時は頭にバックスラッシュをつけるか、whichコマンドでcpコマンドのパスを確認してフルパス入力してコマンド実行しています。
上書き確認されて困った
先日会社のサーバーをアップデートを実施していた時の話です。
squirrelmailというphpで動くオープンソースのメールクライアントを丸ごと上書きして更新しようとしたところ(バックアップはとってありますので)
[root@mackii share]# cp -prf squirrelmail/ /usr/share
cp: `/usr/share/squirrelmail/config/conf.pl' を上書きしてもよろしいですか(yes/no)?
ところがfオプションを指定しているのに上書きしてよいかどうか聞いてくるではありませんか。
対象のフォルダは結構なファイル数。いちいちyesって答えてられない。。。
回避策
そんな時のお手軽回避策は以下の通り。
その1
[root@mackii share]# \cp -prf squirrelmail/ /usr/share/
コマンドの先頭にバックスラッシュをつけてます。
その2
[root@mackii share]# which cp
alias cp='cp -i'
/bin/cp
[root@mackii share]# /bin/cp -prf squirrelmail/ /usr/share/
whichコマンドでcpコマンドのフルパス(cpコマンドの配置場所)を確認し、フルパス指定で実行してます。
原因
原因は簡単でcpコマンドにaliasが定義されていたため。aliasはコマンド入力を用意にするためのショートカットのようなもの。
回避策その1では¥(バックスラッシュ)つきで、その2ではフルパス指定でcpコマンドを実行してaliasを回避してfオプションを有効にしているわけです。
弊社で利用している環境では、デフォルトでいくつか定義されていて、aliasコマンドで確認できます。
[root@mackii ~]# alias
alias cp='cp -i'
alias l='ls -lA'
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 vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-t
llなんかにはすごくお世話になっていますよね。cd fugafugaエンターllみたな手癖になったり。
rmにrm -iが定義されているおかげでうっかりミスも防げるわけです。
今回はそんなうっかりミス回避の定義が裏目に出たわけです。
aliaseの設定方法
aliasを設定するには、
alias cp='cp -i'
のように定義します。コマンド打っただけではログアウトしたら設定が消えてしまいます。
保存しておきたい場合は、ユーザーのホームフォルダ(hogehogeユーザーだったら/home/hogehoge、fugafugaユーザーだったら/home/fugafuga)においてある、
.bashrcファイルに定義しておきましょう。
[root@mackii ~]# cat .bashrc
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
alias vi='vim'
alias l='ls -lA'
参考情報
世の中のエンジニアのalias設定
世の中にどんなalias設定があるのか見てみると面白いです。