一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

我對alias的重新認(rèn)識:通過alias讓rm更安全

 liang1234_ 2019-05-30

本文原創(chuàng)地址在博客園:https://www.cnblogs.com/f-ck-need-u/p/7385133.html

 

bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html


rm的悲劇總是發(fā)生在不經(jīng)意之間,所以無論是在shell腳本中還是交互式bash環(huán)境下,執(zhí)行rm命令時總應(yīng)該三思三思再三思。也因此,很多人想盡辦法防止文件誤刪除,方法也各種各樣。

1.1 alias一般用法

1.默認(rèn)rm是"rm -i"的別名,ll就是"ls -l"的別名??梢宰远x別名來代替某些命令配合某些選項,也可以定義別名組合多個命令。例如:

[root@xuexi ~]# alias ls='ls -lA'

這樣在列出目錄時將同時列出隱藏文件。

2.使用不帶參數(shù)的alias將列出當(dāng)前shell環(huán)境下所有的已定義的別名。

3.另外需要說明的是,當(dāng)別名和命令同名時,將優(yōu)先執(zhí)行別名(否則別名就沒有意義了),這可以從which的結(jié)果中看出:

[root@xuexi ~]# which mv
alias mv='mv -i'
        /bin/mv

如果定義的命名名稱和原始命令同名(例如定義的別名 ls='ls -l' ),此時如果想要明確使用原始命令,可以刪除別名或者使用絕對路徑或者使用轉(zhuǎn)義符來還原命令。

4.alias命令是臨時定義別名,要定義長久生效的別名就將別名定義語句寫入/etc/profile或~/.bash_profile或~/.bashrc,第一個對所有用戶有效,后面兩個對對應(yīng)用戶有效。修改后記得使用source來重新調(diào)取這些配置文件。

5.使用unalias可以臨時取消別名。

1.2 alias的缺陷

別名這東西定義和使用起來有點模糊,以下面這個別名命令為例,在有的shell腳本的書籍上使用了這樣的定義,但卻是錯誤的,原因稍后說明。

alias rmm='cp $@ ~/backup;rm $@'

該別名的目的是刪除文件時先備份到一個目錄下,然后再刪除。按照man bash里的說明,別名rmm只是第一個cp命令的別名,分號后的rm不是別名的一部分,而是緊跟在別名后的下一行命令。當(dāng)執(zhí)行別名rmm時,首先讀取別名到分號位置處,然后進(jìn)行別名擴(kuò)展,執(zhí)行完別名命令后,再執(zhí)行分號后的rm命令。

之所以說上面的命令是錯誤的命令,問題出在cp的參數(shù)"$@",該變量本表示提供的所有參數(shù),但由于cp命令后使用分號分隔并定義了另一個命令,這使得執(zhí)行別名命令時,參數(shù)無法傳遞到cp命令上,而只能傳遞到最后一個命令rm上,也就是說cp后的"$@"是空值。所以該別名等價于:

alias rmm='cp ~/backup;rm $@'

是否真的如此,使用echo測試一番即可。

[root@xuexi ~]# alias rmm='echo cp $@ ~/backup;echo rm $@'
[root@xuexi ~]# rmm /etc/fstab /etc/hosts
cp /root/backup
rm /etc/fstab /etc/hosts

從上面的結(jié)果中看到cp后的"$@"根本就沒有進(jìn)行擴(kuò)展,而是空值。

那如果別名定義語句中沒有使用分號或其他方法定義額外的命令,而是只有一個命令呢?別名一定就能正確工作嗎?非也。以下面的例子為例:

[root@xuexi ~]# alias rmm='echo mv -f $@ ~/backup'

[root@xuexi ~]# rmm /etc/fstab /etc/hosts
mv -f /root/backup /etc/fstab /etc/hosts

發(fā)現(xiàn)問題了嗎?"$@"是擴(kuò)展在"~/backup"目錄之后的,也就是說下面mv的別名想要替代rm,是無法正常工作的:

alias rm='mv -f $@ ~/backup'

之所以無法正常工作,是因為~/backup也是"$@"的一部分,且是"$@"中最前面的參數(shù)。執(zhí)行下面的命令就知道了:

[root@xuexi ~]# echo mv -f "$@" ~/backup /etc/fstab /etc/hosts
mv -f /root/backup /etc/fstab /etc/hosts

從上面的分析可以知道,alias是有其缺陷的,它只適合進(jìn)行簡單的命令和參數(shù)替換、補(bǔ)全,想要實現(xiàn)復(fù)雜的命令替代有點難度。因此man bash中建議盡量使用函數(shù)來取代別名(For almost every purpose, aliases are superseded by shell functions)。

1.3 別名的最佳實現(xiàn)

毫無疑問,寫個shell腳本比別名安全、完整多了,這是替代別名的一種方法。而我個人的建議是,在別名的定義語句中使用函數(shù)來克服別名的缺陷。

例如,為了讓rm安全執(zhí)行,使用以下兩種方法定義別名:

alias rm='copy1(){ /bin/cp -a $@ ~/backup;rm $@; };copy1 $@'
alias rm='move1(){ /bin/mv -f $@ ~/backup; };move1 $@'

因為執(zhí)行別名時的參數(shù)只能傳遞給最后一個命令即copy1或move1函數(shù),但"$@"代表的參數(shù)可以傳遞給函數(shù),讓函數(shù)中的"$@"得到正確的擴(kuò)展,于是整個別名都能合理且正確地執(zhí)行。

或者直接定義一個shell function替代rm。例如向/etc/profile.d/rm.sh文件中寫入:

function rm(){ [ -d ~/rmbackup ] || mkdir ~/rmbackup;/bin/mv -f $@ ~/rmbackup; }
chmod +x /etc/profile.d/rm.sh
source /etc/profile.d/rm.sh

如此,執(zhí)行rm命令時,便會執(zhí)行此處定義的rm函數(shù),使得rm變得更安全。但注意,這樣的函數(shù)默認(rèn)無法直接在腳本中使用,除非使用 export -f function_name 導(dǎo)出函數(shù),使其可以被子shell繼承。所以,可在/etc/profile.d/rm.sh文件的尾部加上導(dǎo)出語句:

function rm(){ [ -d ~/rmbackup ] || mkdir ~/rmbackup;/bin/mv -f $@ ~/rmbackup; }
export -f rm

如果function名和命令名相同,則默認(rèn)優(yōu)先執(zhí)行function,除非使用command明確指定。例如上面定義了rm函數(shù),如果想執(zhí)行rm命令,除了使用/bin/rm,還可以如下操作:

command rm a.txt

如果是在shell腳本里涉及到rm命令,那么更建議在每次rm之前先cd到那個目錄下,然后再rm相對路徑,這樣至少能保證不出現(xiàn)符號"/"。當(dāng)然,更重要的是腳本習(xí)慣一些編寫腳本的規(guī)范,印在骨子里那種,就算想出問題也難。

 

本文原創(chuàng)地址在博客園:https://www.cnblogs.com/f-ck-need-u/p/7385133.html

如果覺得文章不錯,不妨給個打賞,寫作不易,各位的支持,能激發(fā)和鼓勵我更大的寫作熱情。謝謝!

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    色综合伊人天天综合网中文| 欧美人与动牲交a精品| 成人区人妻精品一区二区三区| 久久女同精品一区二区| 国产一区在线免费国产一区| 日韩欧美高清国内精品| 欧美精品一区久久精品| 亚洲精品中文字幕一二三| 丝袜人妻夜夜爽一区二区三区| 国产日韩欧美在线播放| 亚洲欧洲一区二区综合精品| 我想看亚洲一级黄色录像| 又色又爽又无遮挡的视频| 色哟哟国产精品免费视频| 日本高清二区视频久二区| 精品国产品国语在线不卡| 欧美欧美日韩综合一区| 国产精品午夜福利免费在线| 五月情婷婷综合激情综合狠狠| 我要看日本黄色小视频| 国产一区二区久久综合| 亚洲综合天堂一二三区| 日韩欧美第一页在线观看| 国产精品一级香蕉一区| 视频一区中文字幕日韩| 国产伦精品一一区二区三区高清版| 亚洲国产中文字幕在线观看| 日韩女优精品一区二区三区| 深夜日本福利在线观看| 中国日韩一级黄色大片| 亚洲国产精品久久琪琪| 日韩精品中文在线观看| 免费国产成人性生活生活片| 国产精品内射婷婷一级二级| 福利在线午夜绝顶三级| 91播色在线免费播放| 亚洲av一区二区三区精品| 国产精品成人一区二区在线| 中文字幕无线码一区欧美| 国产午夜精品在线免费看| 欧美国产日产在线观看|