在 Linux 命令列下使用“原力”
和絕地武士的原力一樣,
-f
引數是很強大的,並伴隨著潛在的毀滅性,在你能用好的時候又很便利。
近些年來,科幻發燒友開始在每年的 5 月 4 日慶祝星戰節,其口號是絕地武士的祝福語”願原力和你同在“。雖然大多數 Linux 使用者可能不是絕地武士,但我們依然可以使用原力。自然,如果尤達大師只是叫天行者盧克輸入什麼 “man X-Wing 戰機“、“man 原力”,或者 RTFM(去讀原力手冊,肯定是這個意思對不對),那這電影肯定沒啥意思。(LCTT 譯註:RTFM 是 “Read The Fucking Manual” 的縮寫 —— 讀讀該死的手冊吧)。
很多 Linux 命令都有 -f
選項,意思你現在肯定也知道了,原力(LCTT 譯註:force 選項原意是“強制”)!很多時候你先嚐試執行命令然後失敗了,或者提示你需要補充輸入更多選項。通常這都是為了保護你試著改變的檔案,或者告訴使用者該裝置正忙或檔案已經存在之類的。
如果你不想被這些提醒打擾或者壓根就不在乎,就使用原力吧!
不過要小心,通常使用原力選項是摧毀性的。所以使用者一定要格外注意!並且確保你知道自己在做什麼!用原力就要承擔後果!
以下是一些常見 Linux 命令的原力選項和它們的效果,以及常見使用場景。
cp
cp
是 “copy” 的縮寫,這是個被用來複制檔案或者目錄的命令。其 man 頁面 說:
-f, –force
如果已經存在的目標檔案無法被開啟,刪除它並重試
你可能會用它來處理只讀狀態的檔案:
[alan@workstation ~]$ ls -l
total 8
-rw-rw---- 1 alan alan 13 May 1 12:24 Hoth
-r--r----- 1 alan alan 14 May 1 12:23 Naboo
[alan@workstation ~]$ cat Hoth Naboo
Icy Planet
Green Planet
如果你想要複製一個叫做 Hoth
的檔案到 Naboo
,但因為 Naboo
目前是隻讀狀態,cp
命令不會執行:
[alan@workstation ~]$ cp Hoth Naboo
cp: cannot create regular file 'Naboo': Permission denied
但透過使用原力,cp
會強制執行。Hoth
的內容和檔案許可權會直接被複制到 Naboo
:
[alan@workstation ~]$ cp -f Hoth Naboo
[alan@workstation ~]$ cat Hoth Naboo
Icy Planet
Icy Planet
[alan@workstation ~]$ ls -l
total 8
-rw-rw---- 1 alan alan 12 May 1 12:32 Hoth
-rw-rw---- 1 alan alan 12 May 1 12:38 Naboo
ln
ln
命令是用來在檔案之間建立連結的,其 man 頁面 描述的原力選項如下:
-f, –force
移除當前存在的檔案
假設萊婭公主在維護一個 Java 應用伺服器,並且她又一個存放這所有 Java 版本的目錄,比如:
leia@workstation:/usr/lib/java$ ls -lt
total 28
lrwxrwxrwx 1 leia leia 12 Mar 5 2018 jdk -> jdk1.8.0_162
drwxr-xr-x 8 leia leia 4096 Mar 5 2018 jdk1.8.0_162
drwxr-xr-x 8 leia leia 4096 Aug 28 2017 jdk1.8.0_144
正如你所看到的,這裡有很多個版本的 JDK,並有一個符號連結指向最新版的 JDK。她接著用一個指令碼來安裝最新版本的 JDK。但是如果沒有原力選項的話以下命令是不會成功的:
tar xvzmf jdk1.8.0_181.tar.gz -C jdk1.8.0_181/
ln -vs jdk1.8.0_181 jdk
tar
命令會解壓 .gz 檔案到一個特定的目標目錄,但 ln
命令會失敗,因為這個連結已經存在了。這樣的結果是該符號連結不會指向最新版本的 JDK:
leia@workstation:/usr/lib/java$ ln -vs jdk1.8.0_181 jdk
ln: failed to create symbolic link 'jdk/jdk1.8.0_181': File exists
leia@workstation:/usr/lib/java$ ls -lt
total 28
drwxr-x--- 2 leia leia 4096 May 1 15:44 jdk1.8.0_181
lrwxrwxrwx 1 leia leia 12 Mar 5 2018 jdk -> jdk1.8.0_162
drwxr-xr-x 8 leia leia 4096 Mar 5 2018 jdk1.8.0_162
drwxr-xr-x 8 leia leia 4096 Aug 28 2017 jdk1.8.0_144
她可以透過使用原力選項強制 ln
更新連結,但這裡她還需要使用 -n
,-n
是因為這個情況下連結其實指向一個目錄而非檔案。這樣的話,連結就會正確指向最新版本的JDK了。
leia@workstation:/usr/lib/java$ ln -vsnf jdk1.8.0_181 jdk
'jdk' -> 'jdk1.8.0_181'
leia@workstation:/usr/lib/java$ ls -lt
total 28
lrwxrwxrwx 1 leia leia 12 May 1 16:13 jdk -> jdk1.8.0_181
drwxr-x--- 2 leia leia 4096 May 1 15:44 jdk1.8.0_181
drwxr-xr-x 8 leia leia 4096 Mar 5 2018 jdk1.8.0_162
drwxr-xr-x 8 leia leia 4096 Aug 28 2017 jdk1.8.0_144
你可以配置 Java 應用使其一直使用在 /usr/lib/java/jdk
處的 JDK,而不用每次升級都更新。
rm
rm
命令是 “remove” 的縮寫(也叫做刪除,因為某些系統 del
命令也幹這事)。其 man 頁面 對原力選項的描述如下:
-f, –force
無視不存在的檔案或者引數,不向使用者確認
如果你嘗試刪除一個只讀的檔案,rm
會尋求使用者的確認:
[alan@workstation ~]$ ls -l
total 4
-r--r----- 1 alan alan 16 May 1 11:38 B-wing
[alan@workstation ~]$ rm B-wing
rm: remove write-protected regular file 'B-wing'?
你一定要輸入 y
或者 n
來回答確認才能讓 rm
命令繼續。如果你使用原力選項,rm
就不會尋求你的確認而直接刪除檔案:
[alan@workstation ~]$ rm -f B-wing
[alan@workstation ~]$ ls -l
total 0
[alan@workstation ~]$
最常見的 rm
原力選項用法是用來刪除目錄。 -r
(遞迴)選項會讓 rm
刪除目錄,當和原力選項結合起來,它會刪除這個資料夾及其內容而無需使用者確認。
rm
命令和一些選項結合起來是致命的,一直以來網際網路上都有關於誤用 rm
刪除整個系統之類的玩笑和鬼故事。比如最出名的一不當心執行 rm -rf .
會直接刪除目錄和檔案(沒有使用者確認)。(LCTT 譯註:真的這麼幹過的校對飄過~~請按下回車前再三確認:我是誰,我在哪裡,我在幹什麼)
userdel
userdel
命令使用來刪除使用者的。其 man 頁面 是這樣描述它的原力選項的:
-f, –force
這個選項會強制移除使用者,即便使用者當前處於登入狀態。它同時還會強制 刪除使用者的目錄和郵件儲存,即便這個使用者目錄被別人共享或者郵件儲存並不 屬於這個使用者。如果
USERGROUPS_ENAB
在/etc/login.defs
裡是yes
並且有一個組和此使用者同名的話,這個組也會被移除,即便這個組還是別 的使用者的主要使用者組也一樣。注意:這個選項有風險並可能讓系統處於不穩定狀態。
當歐比旺抵達穆斯塔法星的時候,他知道自己的使命。他需要刪掉達斯·維達的使用者賬戶——而達斯還在裡面呢。
[root@workstation ~]# ps -fu darth
UID PID PPID C STIME TTY TIME CMD
darth 7663 7655 0 13:28 pts/3 00:00:00 -bash
[root@workstation ~]# userdel darth
userdel: user darth is currently used by process 7663
因為達斯還登在系統裡,歐比旺需要使用原力選項操作 userdel
。這能強制刪除當前登入的使用者。
[root@workstation ~]# userdel -f darth
userdel: user darth is currently used by process 7663
[root@workstation ~]# finger darth
finger: darth: no such user.
[root@workstation ~]# ps -fu darth
error: user name does not exist
正如我們所見到的一樣,finger
和 ps
命令讓我們確認了達斯已經被刪除了。
在 Shell 指令碼里使用原力
很多命令都有原力選項,而在 shell 指令碼里他們特別有用。因為我們經常使用指令碼完成定期或者自動化的任務,避免使用者輸入至關重要,不然的話自動任務就無法完成了
我希望上面的幾個例子能幫你理解一些需要使用原力的情況。你在命令列使用原力或把它們寫入指令碼之前應當完全理解它們的作用。誤用原力會有毀滅性的後果——時常是對整個系統,甚至不僅限於一臺裝置。
via: https://opensource.com/article/19/5/may-the-force-linux
作者:Alan Formy-Duval 選題:lujun9972 譯者:Jerry Ling 校對:wxy
本文由 LCTT 原創編譯,Linux中國 榮譽推出
相關文章
- 在 Linux 命令列中使用 tcpdump 抓包Linux命令列TCP
- 在 Linux 中使用ImageMagick命令列操作影像檔案Linux命令列
- 使用 xclip 在 Linux 命令列中複製貼上Linux命令列
- 在 Linux 命令列中使用 nudoku 解決謎題Linux命令列
- 使用 Calcurse 在 Linux 命令列中組織任務Linux命令列
- Linux 命令列下連線WiFiLinux命令列WiFi
- 在 Linux 命令列中使用 ls 列出檔案的技巧Linux命令列
- Linux 命令列下的好東西Linux命令列
- Linux系統壓力測試工具(命令列工具)Linux命令列
- 在linux下啟動tomcat命令LinuxTomcat
- 在 Linux 命令列中轉換大小寫Linux命令列
- 在Linux命令列檢視影像的方法Linux命令列
- Linux命令列Linux命令列
- linux下的命令列播放器mocLinux命令列播放器
- Cygwin,在windows中使用linux命令WindowsLinux
- 在 Linux中find命令使用技巧Linux
- 在 Linux 命令列上使用日曆Linux命令列
- 在Linux命令列傳送電子郵件Linux命令列
- Linux 命令列下的最佳文字編輯器Linux命令列
- Linux 黑乎乎的命令列下,如何除錯 Python?Linux命令列除錯Python
- Linux的使用2 常用命令列Linux命令列
- 在 Linux 中如何從命令列查詢 VirtualBox 版本Linux命令列
- Linux下命令列開啟關閉觸控板Linux命令列
- linux 下MySQL命令列匯出csv檔案格式LinuxMySql命令列
- Linux下命令列中的複製和貼上Linux命令列
- Linux 下使用 killall 命令終止程式Linux
- 如何在 Linux 命令列中切換使用者Linux命令列
- 如何使用Linux設定命令列海外IP代理?Linux命令列
- Linux下使用壓力測試工具stressLinux
- Linux命令列筆記Linux命令列筆記
- 在 Linux 命令列傳送郵件的 5 種方法Linux命令列
- 在Linux命令列中進行大小寫字元轉換Linux命令列字元
- 在 Linux 命令列中規劃你的假期日曆Linux命令列
- 在 Linux 下 9 個有用的 touch 命令示例Linux
- 在Linux命令列內的大小寫轉換(附全套Linux影片教程)Linux命令列
- 在Linux中如何使用at命令安排任務Linux
- 在 Linux 中使用 top 命令的建議Linux
- 收集 Linux 命令列執行的命令Linux命令列