'!'Linux 中的符號或運算符可用作邏輯否定運算符,也可通過調(diào)整從歷史記錄中獲取命令,或通過修改運行先前運行的命令。以下所有命令均已在 bash Shell 中明確檢查。雖然我沒有檢查過,但其中大部分不會在其他 shell 中運行。
按命令編號運行歷史記錄中的命令。
您可能不知道您可以從歷史命令(已經(jīng) / 較早執(zhí)行的命令)運行命令這一事實。要開始,首先通過運行 “history” 命令找到命令編號。
$history
現(xiàn)在,在history的輸出中,僅按照它出現(xiàn)的編號運行來自history的命令。假設(shè)運行出現(xiàn)在'history' 命令輸出中編號為1551的命令。
$!1551
并且,它運行在編號1551中列出的命令。這種檢索已執(zhí)行命令的方法非常有用,特別是在那些很長的命令的情況下。您只需要使用**!**來調(diào)用它。
將先前執(zhí)行的命令作為倒數(shù)第二個命令、倒數(shù)第 7 個命令等運行。
你可以運行那些你之前運行過的命令,它們的運行順序是最后一個運行命令將表示為**-1**,倒數(shù)第二個為**-2**,倒數(shù)第七個為**-7**,......。
首先運行history命令以獲取上次執(zhí)行命令的列表。有必要運行history命令,這樣您就可以確保沒有類似的命令rm command > file和其他命令,只是為了確保您不會意外運行任何危險的命令。然后檢查第六個最后一個命令,八個最后一個命令和第十個最后一個命令。
$history $!-6 $!-8 $!-10
按數(shù)字運行上次執(zhí)行的命令
將我們運行的最后一個命令的參數(shù)傳遞給新命令,無需重新輸入
我需要列出目錄 “/home/$USER/Binary/firefox” 的內(nèi)容。
$ls/home/$USER/Binary/firefox
然后我意識到我應(yīng)該觸發(fā) “ls -l” 以查看哪個文件在那里可執(zhí)行?所以我應(yīng)該再次輸入整個命令!不,我不需要。我只需要將這個新命令的最后一個參數(shù)作為:
$ls-l!$
這里!$將攜帶在最后一個命令中傳遞給這個新命令的參數(shù)。
將上次執(zhí)行命令的參數(shù)傳遞給新命令
如何使用 (!) 處理兩個或多個參數(shù)
假設(shè)我在桌面上創(chuàng)建了一個文本文件1.txt。
$touch/home/avi/Desktop/1.txt
然后使用cp命令在任一側(cè)使用完整路徑將其復制到 “/home/avi/Downloads”。
$cp/home/avi/Desktop/1.txt/home/avi/downloads
現(xiàn)在我們已經(jīng)使用cp命令傳遞了兩個參數(shù)。第一個是 “/home/avi/Desktop/1.txt”,第二個是 “/home/avi/Downloads”,讓我們以不同的方式處理它們,只需執(zhí)行echo [arguments]以不同方式打印兩個參數(shù)。
$echo"1stArgumentis:!^" $echo"2ndArgumentis:!cp:2"
注意第一個參數(shù)可以打印為“!^”,其余參數(shù)可以通過執(zhí)行“![Name_of_Command]:[Number_of_argument]”.
在上面的例子中,第一個命令是 “cp”,第二個參數(shù)需要打印。因此“!cp:2”,如果任何命令說xyz使用 5 個參數(shù)運行并且您需要獲得第 4 個參數(shù),您可以使用“!xyz:4”,并根據(jù)需要使用它。所有參數(shù)都可以通過 訪問“!*”。
處理兩個或更多參數(shù)
根據(jù)關(guān)鍵字執(zhí)行最后一條命令我們可以根據(jù)關(guān)鍵字執(zhí)行上次執(zhí)行的命令。我們可以這樣理解:
$ls/home>/dev/null[Command1] $ls-l/home/avi/Desktop>/dev/null[Command2] $ls-la/home/avi/Downloads>/dev/null[Command3] $ls-lA/usr/bin>/dev/null[Command4]
在這里,我們使用了相同的命令**(ls),但使用了不同的開關(guān)和不同的文件夾。此外,我們已將每個命令的輸出發(fā)送到 “/dev/null**”,因為我們不會處理命令的輸出,控制臺也保持干凈。
現(xiàn)在根據(jù)關(guān)鍵字執(zhí)行上次運行命令。
$!ls[Command1] $!ls-l[Command2] $!ls-la[Command3] $!ls-lA[Command4]
檢查輸出,您會驚訝地發(fā)現(xiàn)您只是通過ls關(guān)鍵字運行已執(zhí)行的命令。
根據(jù)關(guān)鍵字運行命令
神奇的!!
您可以使用(!!).它將在當前命令中使用 alter/tweak 調(diào)用最后一個運行命令。給你看場景
最后一天我運行了一個單行腳本來獲取我的私有 IP,所以我運行,
$ipaddrshow|grepinet|grep-v'inet6'|grep-v'127.0.0.1'|awk'{print$2}'|cut-f1-d/
然后我突然發(fā)現(xiàn)我需要將上面腳本的輸出重定向到一個文件ip.txt,那我該怎么辦?我應(yīng)該再次重新輸入整個命令并將輸出重定向到文件嗎?那么一個簡單的解決方案是使用UP導航鍵并添加'> ip.txt'將輸出重定向到文件。
$ipaddrshow|grepinet|grep-v'inet6'|grep-v'127.0.0.1'|awk'{print$2}'|cut-f1-d/>ip.txt
UP鍵可以快速找到歷史命令。現(xiàn)在考慮以下條件,下次我在單行腳本下運行時。
$ifconfig|grep"inetaddr:"|awk'{print$2}'|grep-v'127.0.0.1'|cut-f2-d:
一旦我運行腳本,bash 提示符就會返回一個錯誤消息“bash: ifconfig: command not found”,我不難猜測我以用戶身份運行此命令,而它應(yīng)該以 root 身份運行。
那么有什么解決辦法呢?很難登錄到 root 然后再次鍵入整個命令!此外,上一個示例中的(向上導航鍵)在這里也沒有出現(xiàn)。所以?我們需要“!!”不帶引號調(diào)用,這將調(diào)用該用戶的最后一個命令。
$su-c!!root
這里su是切換用戶,也就是 root,-c以用戶身份運行特定的命令,最重要的部分!!將被命令替換,最后運行的命令將在這里替換。是的!您需要提供 root 密碼。
!!主要在以下場景中使用,
當我以普通用戶身份運行apt-get命令時,我通常會收到一個錯誤,說您無權(quán)執(zhí)行。
$apt-getupgrade&&apt-getdist-upgrade
Opps 錯誤... 不要擔心執(zhí)行以下命令以使其成功..
$su-c!!
$serviceapache2start or $/etc/init.d/apache2start or $systemctlstartapache2
OOPS 用戶無權(quán)執(zhí)行此類任務(wù),所以我運行..
$su-c'serviceapache2start' or $su-c'/etc/init.d/apache2start' or $su-c'systemctlstartapache2'
運行影響除 ![FILE_NAME] 之外的所有文件的命令
該!(邏輯 NOT)可以用來運行所有命令的文件 / 文件擴展名,除了后面'!'。
A.從目錄中刪除所有文件,但名稱為2.txt的文件除外。
$rm!(2.txt)
**B.**從文件夾中刪除所有文件類型,除了擴展名為 “pdf”的文件類型。
$$rm!(*.pdf)
檢查一個目錄(比如 / home/avi/Tecmint)是否存在?printf 如果所述目錄存在與否。
在這里,我們將使用'! -d'來驗證目錄是否存在,然后使用邏輯 AND 運算符(&&)來打印該目錄不存在,然后使用邏輯 OR 運算符(||)來打印目錄是否存在。
邏輯是,當輸出[ ! -d /home/rumenz ]為0 時,它將執(zhí)行超出 Logical 的內(nèi)容**,否則它將轉(zhuǎn)到 Logical OR(||)并執(zhí)行超出 LogicalOR 的內(nèi)容**。
$[!-d/home/rumenz]&&printf' nosuch/home/rumenzdirectoryexist '||printf' /home/rumenzdirectoryexist '
檢查目錄是否存在?如果沒有退出命令。與上述條件類似,但這里如果所需目錄不存在,它將退出命令。
$[!-d/home/rumenz]&&exit
如果它不存在,則在您的主目錄中創(chuàng)建一個目錄(比如 rumenz)。腳本語言中的一種通用實現(xiàn),如果所需目錄不存在,它將創(chuàng)建一個。
[!-d/home/rumenz]&&mkdir/home/rumenz
審核編輯:劉清
-
Linux系統(tǒng)
+關(guān)注
關(guān)注
4文章
596瀏覽量
27526 -
Shell
+關(guān)注
關(guān)注
1文章
366瀏覽量
23478
原文標題:linux中嘆號(!)的10個技巧
文章出處:【微信號:良許Linux,微信公眾號:良許Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論