對(duì)話 UNIX,第 13 部分: 另外十種命令行組合
本文是“對(duì)話 Unix系列文章中的第 13 部分:我以前認(rèn)為 13 是個(gè)不吉利的數(shù)字,直到我瀏覽 Internet 搜尋這個(gè)數(shù)字之所以不吉利的原因。實(shí)際上,13 這個(gè)數(shù)字可以說(shuō)是喜憂參半(請(qǐng)參見(jiàn)參考資料)。
好的方面:13 是元素鋁的原子序數(shù),而鋁可用于制作各種祭神儀式的奠酒容器;籃球職業(yè)運(yùn)動(dòng)員 Wilt Chamberlain 身著 13 號(hào)球衣(我們都知道,Wilt 是非常幸運(yùn)的);按照某種禁忌轉(zhuǎn)換方式,13 是第 7 個(gè)質(zhì)數(shù),而數(shù)字 7 象征著幸運(yùn)。
不好的方面:絞刑架有 13 級(jí)臺(tái)階;制造混亂的神“洛基和猶大,都是第 13 個(gè)到達(dá)的;并且無(wú)論您怎么對(duì)其劃分(除以 2、3、4、或者6),在餐館中 13 個(gè)人都很難坐,這可能正是洛基和猶大被認(rèn)為是局外人的原因。
陪審團(tuán)最多不超過(guò) 13 個(gè)人。所以,除非您在 13 號(hào)星期五閱讀本文,并且在位于 Mockingbird Lane(這是個(gè)歷史悠久的地方)1313 號(hào)的辦公樓的第 13 層,否則都是值得慶幸的。“對(duì)話 UNIX現(xiàn)在是個(gè)長(zhǎng)滿青春痘的青少年了。本文將介紹十種命令行組合和 Shell 訣竅,以慶祝本系列文章進(jìn)入青春期。恭喜您!
臨時(shí)設(shè)置一個(gè)環(huán)境變量
環(huán)境變量,如 EDITOR 和 TZ,可能影響命令執(zhí)行的結(jié)果。(前者選擇進(jìn)行文本編輯時(shí)所啟動(dòng)的程序;而后者可以指定您的時(shí)區(qū)。)通常,您可以在 Shell 啟動(dòng)文件中設(shè)置環(huán)境變量,以便對(duì)所有的 Shell 會(huì)話產(chǎn)生作用,并且您可以在任何時(shí)候使用像 export TZ=GMT 這樣的命令為一個(gè) Shell 會(huì)話更改環(huán)境變量的值。
此外,您可以為單個(gè)命令臨時(shí)地修改一個(gè)環(huán)境變量的值。只需要在啟動(dòng)命令行的時(shí)候設(shè)置環(huán)境變量以及您希望運(yùn)行的命令即可。例如,要為單個(gè)命令更改您的首選編輯器,可以在它的前面加上 EDITOR=editor ,如下所示:
$ printenv...EDITOR=vi...$ EDITOR="pico" less bigfile
這個(gè)組合可以使用 less 對(duì) bigfile 進(jìn)行分頁(yè)。如果您在 less 中輸入 v 以編輯文件,那么將啟動(dòng) pico 而不是 vi。下面是另一個(gè)實(shí)際的使用情況:
$ dateSun Aug 5 16:14:17 EDT 2007$ TZ="Japan" dateMon Aug 6 05:14:06 JST 2007
對(duì) TZ 進(jìn)行的臨時(shí)更改將影響 date 的即時(shí)實(shí)例解釋系統(tǒng)當(dāng)前日期和時(shí)間的方式。
查看您實(shí)際正在運(yùn)行的命令
大量的 Shell 特性可以影響到如何解釋您所輸入的命令名。每種 Shell 都有一個(gè)內(nèi)置命令的分類;PATH 環(huán)境變量用于指定搜索的列表和目錄;而別名可以作為簡(jiǎn)寫。要運(yùn)行一個(gè)程序可以使用許多方法,如何了解實(shí)際執(zhí)行的是什么命令呢?使用 Shell 內(nèi)置的 type 命令可以揭示實(shí)際的情況。
假設(shè)您擁有下面的這些 Shell 設(shè)置:
PATH=/bin:/usr/bin:/usr/local/binalias vi=pico
您可以在 /usr/bin 和 /usr/local/bin 中找到 Perl 的副本。要查明您正使用的是哪個(gè) Perl,可以輸入 type perl。
$ perl -vThis is perl, v5.8.7 built for darwin-2level$ type perlperl is /use/local/bin/perl$ type -a perlperl is /usr/local/bin/perlperl is /usr/bin/perl$ type -a -w perlperl: commandperl: command
type perl 命令顯示了如何在命令行中對(duì) perl 命令進(jìn)行解釋。在這個(gè)示例中,/usr/local/bin/perl 是實(shí)際的擴(kuò)展結(jié)果。type -a 命令顯示了 Shell 所知道的所有 Perl 實(shí)例,這在很大程度上依賴于 PATH 變量。
可以針對(duì)您常用的其他命令使用 type:
$ type -a vivi is an alias for picovi is /usr/bin/vi$ type -a cdcd is a shell builtincd is /usr/bin/cd
type 命令顯示出,vi 實(shí)際上是 pico 的別名。type 命令還顯示出,cd 是一個(gè)內(nèi)置的命令,并且與外部命令 /usr/bin/cd 是相同的。
使得 find 命令具有更好的可移植性
去年曾經(jīng)介紹了許多關(guān)于 find 的使用的內(nèi)容,但是我忽略了其中的一個(gè)選項(xiàng),它使得 find 命令行可以移植到其他操作系統(tǒng)。
通常,Unix® 系統(tǒng)中很少使用帶空格的文件名。然而,在 Mac OS X 和 Microsoft® Windows® 中常常使用更長(zhǎng)的、更具描述性的文件名,并且在 UNIX 中它們也變得越來(lái)越多,這是因?yàn)樵摬僮飨到y(tǒng)不斷地積聚更多的桌面特性。畢竟,將一份報(bào)告保存為 2007 Business Plan 明顯要比 bizplan07.ooo 好得多。
find 命令使用嵌入的特殊字符列舉長(zhǎng)文件名,但是,如果您希望將 find 與另一個(gè)命令組合使用,那么最安全的方法是,使用 NUL 字符(而不是空格)分隔列表中的每個(gè)文件名。讓我們來(lái)了解其中的差異。
我們假設(shè)您擁有三個(gè)文件夾,其中一個(gè)或者多個(gè)目錄的名稱中包含空格:
$ ls -1Business Plan 2007Expense ReportPictures from Spain
如果您對(duì)大量的文件運(yùn)行 find 命令,并且將結(jié)果列表傳遞給 xargs,那么文件名中的空格將會(huì)導(dǎo)致錯(cuò)誤:
$ find . -type f -print | xargs ls -1ls: ./Business: No such file or Directoryls: ./Expense: No such file or directoryls: ./Pictures: No such file or directoryls: 2007: No such file or directoryls: Plan: No such file or directoryls: Report: No such file or directoryls: Spain: No such file or directoryls: from: No such file or directory
傳遞給 xargs 的結(jié)果是單個(gè)字符串 . ./Business Plan 2007 ./Expense Report ./Pictures from Spain。在缺省情況下,xargs 將使用空格(或者換行符)對(duì)輸入字符串進(jìn)行劃分,以便產(chǎn)生可以進(jìn)行操作的一個(gè)文件列表。在這個(gè)示例中,因?yàn)槲募邪崭瘢赃@樣做將會(huì)產(chǎn)生錯(cuò)誤的列表,如前所述。
一種適當(dāng)?shù)摹⒖梢浦驳募夹g(shù)是使用 find -print0,加上 xargs -0,以便使用 NUL 字符對(duì)文件名進(jìn)行劃分。下面是這種推薦的方法:
$ find . -type f -print0 | xargs -0 ls -1./Business Plan 2007./Expense Report./Pictures from Spain
另外,如果您希望預(yù)覽 xargs 產(chǎn)生的命令,可以添加選項(xiàng) -p 或者 -t。-p 選項(xiàng)顯示每個(gè)合成的命令,并提示您進(jìn)行確認(rèn)。輸入大寫的或者小寫的 y 以便運(yùn)行命令,輸入任何其他的內(nèi)容可以拒絕該命令。-t 選項(xiàng)可以在執(zhí)行每個(gè)命令之前將命令回顯到 stderr。
更充分地利用 find 命令
盡管 find 非常有用,但是有兩個(gè)隱含的設(shè)置可能會(huì)限制它的結(jié)果(并使得您不知所措):-name 匹配是區(qū)分大小寫的,并且不會(huì)根據(jù)符號(hào)鏈接對(duì)文件系統(tǒng)進(jìn)行遍歷。
因此,一個(gè)以 find -name '*plan*' 開(kāi)頭的命令將忽略名稱中包含 Plan 字符串的文件,假設(shè)您的 home 目錄中包含名為 music 的符號(hào)鏈接,而它指向裝入到 /media/music 的 TB 級(jí)的存儲(chǔ)介質(zhì),那么這個(gè)命令將不會(huì)列出您的符號(hào)鏈接 music。
您可以使用 -iname 覆蓋區(qū)分大小寫的匹配,并且您可以使用 -follow 根據(jù)符號(hào)鏈接進(jìn)行遍歷。下面是使用了這兩種選項(xiàng)的一個(gè)示例:
$ alias ls='ls -aF'$ ls -1bin/lib/src/tomb/tunes@$ find . -name '*music*' -type f -print$ find . -iname '*music*' -type f -print$ find . -name '*music*' -type f -follow -print$ find . -iname '*music*' -type f -follow -print./tunes/Muse/Origin Of Symmetry/04 Hyper Music.m4a./tunes/Radiohead/OK Computer/04 Exit Music (For A Film).MP3
正如 -F 選項(xiàng)生成的 @ 符號(hào)注釋所表示的,tunes 是一個(gè)符號(hào)鏈接。要查找名稱中包含字符串“music的任何變體的所有歌曲,您必須使用 -iname *music*。要遍歷到 tunes 所指向的文件系統(tǒng)層次結(jié)構(gòu),您必須使用 -follow。
為了使得 find 更具可移植性,并且類似于 Spotlight 的搜索特性,那么應(yīng)該使用 -print0 -follow -iname pattern 。
收集許多命令的輸出的簡(jiǎn)單方法
通過(guò)使用 > output 和 >> output 修飾符,您可以很容易地捕獲一個(gè)命令行的輸出,其中前者用于創(chuàng)建或者覆蓋文件 output ,而后者則將內(nèi)容追加到 output 。您可以組合使用任何修飾符以生成一系列命令的文本,如果您正嘗試對(duì)系統(tǒng)狀態(tài)進(jìn)行快照,這種方法是非常有價(jià)值的,例如:
$ ps > state.`date '+%F'`$ w >> state.`date '+%F'`
反勾號(hào)或反引號(hào)操作符 (``) 可以對(duì)命令進(jìn)行擴(kuò)展。在 Shell 對(duì)命令行進(jìn)行解釋時(shí),將執(zhí)行反勾號(hào)之間的命令,并在最終的擴(kuò)展結(jié)果中使用該命令的輸出。在本示例中,參數(shù)周圍的單引號(hào)用于保持參數(shù)不變,從而可以避免 Shell 對(duì) + 和 % 進(jìn)行解釋。
在執(zhí)行了這兩個(gè)命令之后,創(chuàng)建了文件 state.YYYY-MM-DD,如 state.2007-08-05,其內(nèi)容與以下所示類似:
PID TTY TIME CMD9997 pts/100:00:00 zsh10351 pts/100:00:00 ps17:56:04 up 21 days, 2:53, 2 users, load average: 0.89, 0.94, 0.91USER TTY FROM LOGIN@ IDLE JCPU PCPU WHATadamgood pts/0c-67-169-182-255 Sat170.00s 0.37s 0.36s pinemstreich pts/1cpe-071-065-224- 17:170.00s 0.01s 0.00s w
不過(guò),每次輸入反勾號(hào)操作是非常麻煩的。您可以使用下面的命令來(lái)代替這個(gè)序列:
$ file=state.`date '+%F'`$ ps > $file$ w >> $file
但是,雖然這樣做稍微有效一些,但仍然可能出現(xiàn)錯(cuò)誤,因?yàn)樵诘诙€(gè)或者后續(xù)的命令中,很可能使用 > 而不是 >>。要捕獲一系列命令的輸出,最簡(jiǎn)單的方法是使用大括號(hào) ({ }) 將命令括起來(lái)。
$ { ps; w } > state.`date '+%F'`
ps 命令運(yùn)行(列出用戶當(dāng)前的進(jìn)程),然后是 w(它將顯示誰(shuí)正在使用這臺(tái)計(jì)算機(jī)),并將收集到的輸出保存到一個(gè)文件中。
注意: 您還可以在圓括號(hào)中嵌入一個(gè)命令序列,以得到相同的結(jié)果;然而,兩者之間有一個(gè)重要的區(qū)別。在圓括號(hào)中的系列命令將在一個(gè)子 Shell 中運(yùn)行,并且不會(huì)對(duì)當(dāng)前 Shell 的狀態(tài)產(chǎn)生影響。
例如,您可能希望運(yùn)行這個(gè)序列:$ { cd $HOME; ls -1}; pwd
它將與下面的命令產(chǎn)生相同的輸出:$ (cd $HOME; ls); pwd
大括號(hào)中的命令更改了當(dāng)前 Shell 的工作目錄。后面的這種技術(shù)則無(wú)能為力。是使用組合還是子 Shell,這取決于您的目的,盡管子 Shell 的功能更強(qiáng)大一些,下面將對(duì)其進(jìn)行描述。
子 Shell 可以為您提供幫助!
盡管通常運(yùn)行子 Shell 將聚合的輸出通過(guò)管道傳遞給單個(gè)命令,但您還可以使用子 Shell 對(duì)命令進(jìn)行擴(kuò)展,就像反勾號(hào)那樣。然而更有價(jià)值的是,子 Shell 可以包含另一個(gè)子 Shell,所以還可以進(jìn)行嵌套擴(kuò)展。
讓我們來(lái)看看下面簡(jiǎn)單的例子。
$ {ps; w} > state.$(date '+%F')
這個(gè)命令與 { ps; w } > state.`date '+%F'` 是相同的。$( ) 符號(hào)運(yùn)行圓括號(hào)中的命令,然后使用輸出來(lái)替換自己。換句話說(shuō),$() 可以進(jìn)行擴(kuò)展,就像反勾號(hào)一樣。然而,與反勾號(hào)不同的是,$( ) 非常復(fù)雜,并且甚至可以包括其他 $( ) 擴(kuò)展。下面提供了一些示例:
$ (cd $(grep strike /etc/passwd | cut -f6 -d':'); ls)
這個(gè)命令在密碼文件中搜索用戶 strike 對(duì)應(yīng)的條目,提取其 home 目錄(密碼文件中的第 6 個(gè)字段,如果您從 0 開(kāi)始數(shù))字段,更改到這個(gè)目錄,并列出其中的內(nèi)容。grep /etc/passwd strike | cut -f6 -d':' 的輸出將在執(zhí)行任何其他操作之前進(jìn)行擴(kuò)展。
下面是另一個(gè)示例,這次的用戶名來(lái)自于 whoami 的結(jié)果:
(cd $(grep $(whoami) /etc/passwd | cut -f6 -d':'); ls)
因?yàn)樽?Shell 有許多用途,所以與組合或者反勾號(hào)操作符相比,您可能更喜歡使用它。
不再輸入長(zhǎng)路徑名
有些特性,如 PATH 和 MANPATH 環(huán)境變量,可以減少輸入工作量。這兩個(gè)變量分別為搜索可執(zhí)行文件和 man 頁(yè)面定義了一系列目錄。
Shell 支持另一個(gè)搜索路徑:CDPATH。顧名思義,CDPATH 列出了搜索命名目錄的目錄列表。讓我們看看它是如何工作的。
假設(shè)您的 home 目錄中有三個(gè)目錄,它們分別是 tomb、current 和 personal。tomb 目錄中包含舊的工作項(xiàng)目;current 目錄中包含當(dāng)前工作的內(nèi)容;而 personal 目錄中包含您所感興趣的一些文件和內(nèi)容。執(zhí)行 ls -R tomb current personal 命令可以得到與下面所示類似的內(nèi)容:
$ ls -R tomb current personalcurrent:./../ einstein/ herbIE/personal:./ ../ fishing/ novel/tomb:./ ../ mariner/ marvin/ voyager/
對(duì)于這種結(jié)構(gòu),如果不使用 CDPATH,要更改到任何目錄都需要記住文件夾的位置,并輸入完全限定的(或者相對(duì)的)路徑名:
$ cd ~/tomb/mariner$ cd ~/personal/novel$ cd ~/current/einstein
為了簡(jiǎn)化這項(xiàng)任務(wù),可以將 CDPATH 設(shè)置為您所需要的搜索命名目錄的目錄列表:
$ export CDPATH=.:~/:..:../..:
這是 CDPATH 的最小設(shè)置。它將按順序搜索當(dāng)前目錄(.,或者“點(diǎn))、您的 home 目錄 (~/)、父目錄(..,或者“點(diǎn)點(diǎn))、父目錄的父目錄目錄 (../..)。最小設(shè)置首先搜索本地目錄以及附近的一些目錄。
在設(shè)置了這個(gè) CDPATH 之后,您可以快速地更改到任何頂層目錄:
$ pwd/tmp$ cd current/home/strike/current$ cd personal/fishing/home/strike/personal/fishing$ cd novel/home/strike/personal/novel$ cd /tmp$ cd personal/novel/home/strike/personal/novel$ cd /tmp$ cd novelcd: no such file or Directory: novel
除最后一個(gè) cd 命令之外,所有命令的參數(shù)都在 CDPATH 中存在匹配的目錄。然而,因?yàn)?personal 目錄不在 CDPATH 中,所以無(wú)法找到 novel(如果您位于相對(duì)路徑之外)。
如果您希望搜索 personal 目錄和其他的兩個(gè)目錄,那么可以將它們添加到 CDPATH 的最后一個(gè)冒號(hào)的后面,或者根據(jù)您所需要的搜索順序進(jìn)行添加。添加三個(gè)目錄,假設(shè)您的 Shell 啟動(dòng)文件中包含前面的 export 命令:
$ export CDPATH=$CDPATH:~/current:~/tomb:~/personal
現(xiàn)在,您只需要輸入希望切換到的目錄的名稱即可:
$ cd current/home/strike/current$ cd /tmp$ cd einstein/home/strike/current/einstein$ cd fishing/home/strike/personal/fishing$ cd personal/novel/home/strike/personal/novel
與 PATH 和 MANPATH 一樣,如果 CDPATH 中的多個(gè)條目都包含匹配項(xiàng),那么在找到第一個(gè)匹配項(xiàng)后將停止搜索。例如,如果您向 tomb 中添加一個(gè)名為 novel 的目錄,那么 cd novel 命令將得到 ~/tomb/novel。
$ mkdir ~/tomb/novel$ cd /tmp$ cd novel/home/strike/tomb/novel$ cd personal/novel/home/strike/personal/novel
如果其條目中包含唯一的目錄名,那么 CDPATH 是最有效的。否則,必須輸入足夠長(zhǎng)的路徑以進(jìn)行區(qū)別,比如 personal/novel。
取得事半功倍的效果
您已經(jīng)看到了許多示例,說(shuō)明文本文件在 Unix 系統(tǒng)中有著廣泛的用途。大多數(shù)系統(tǒng)啟動(dòng)文件都是文本文件,包括 Shell 腳本、配置文件,當(dāng)然還包括數(shù)據(jù)文件。除了文本編輯器之外,最有價(jià)值的實(shí)用工具就是翻頁(yè)工具 (pager)、或者允許您逐頁(yè)瀏覽文本文件的應(yīng)用程序。
應(yīng)用程序 less 是最常用的翻頁(yè)工具之一,并且它提供了大量的選項(xiàng)以調(diào)整它的行為。事實(shí)上,您可以將 LESS 環(huán)境變量設(shè)置為相關(guān)選項(xiàng)的列表,以便控制 less 的缺省工作方式。下面是一組有用的選項(xiàng):
export LESS="-Nmsx4"
-N 可以顯示行號(hào)。
-m 能夠以百分比的形式顯示在文件的當(dāng)前位置。
-s 可以將多個(gè)空行“壓縮或者減少為單個(gè)空行。
-x4 可以將制表位設(shè)置為四個(gè)空格。
請(qǐng)仔細(xì)地閱讀 less 的 man 頁(yè)面,以便找到對(duì)您最有幫助的選項(xiàng)。
從下到上閱讀文件
在 UNIX 系統(tǒng)中,許多文件會(huì)不斷地增大,直到被截?cái)嗷蛘哌M(jìn)行存檔。例如,最重要的一些系統(tǒng)處理,如電子郵件傳輸和遠(yuǎn)程訪問(wèn)、持續(xù)日志記錄活動(dòng),都會(huì)在文件的末尾添加新的條目。并且是最感興趣的日志文件的末尾。如果某個(gè)服務(wù)崩潰了,那么最后發(fā)生的事件將提供最有價(jià)值的線索。
有兩種方法可以逆序顯示文件中的行:tac(將 cat 反過(guò)來(lái))和 tail -r 命令。
$ cat smallfileabc$ tac smallfilecba$ tail -r smallfilecba
您可能會(huì)發(fā)現(xiàn) tac 更加實(shí)用一些,因?yàn)樗鼘@示整個(gè)文件,這與 tail 是不同的,后者將對(duì)輸出進(jìn)行截?cái)啵伙@示若干行的內(nèi)容。例如,您可以組合使用 tac 和 less 以創(chuàng)建一個(gè)別名,用于對(duì)文件進(jìn)行逆序分頁(yè):
$ alias rless="LESSOPEN='|tac %s' less"$ rless smallfilecba
rless 別名臨時(shí)地將 LESSOPEN 設(shè)置為 |tac %s,這是特定于 less 的一個(gè)環(huán)境變量。這樣可以強(qiáng)制使用 tac 對(duì)每個(gè)文件(%s 是文件名的占位符)進(jìn)行預(yù)處理(所以使用了管道 |)。
下面提供了這個(gè)相同技巧的另一種變體,但是它使用了 perl 而不是 tac,在您的系統(tǒng)中可能無(wú)法使用這個(gè)命令:
LESSOPEN="|perl -e 'print reverse (<>)' %s" less small
包含 perl 的那行命令表示“將所有的輸入行讀入一個(gè)匿名數(shù)組 ((<>)),顛倒元素的順序,并打印這個(gè)新的數(shù)組。
進(jìn)行新的數(shù)學(xué)運(yùn)算
如果您需要計(jì)算一個(gè)結(jié)果,那么并不需要轉(zhuǎn)到一個(gè)新的應(yīng)用程序。您可以繼續(xù)在命令行中完成這項(xiàng)任務(wù)。您可以使用 dc(這是一種逆波蘭式計(jì)算器),或者 bc(這是一種用于數(shù)學(xué)運(yùn)算的完整的腳本編程語(yǔ)言)。或者,如果您需要馬上獲得答案,那么可以使用命令行和 $(( )) 操作符。
$ echo $(( 100 / 10 ))10$ echo $(( 10 ** 2 ))100
Shell 并沒(méi)有提供大量的算術(shù)操作符,但是已經(jīng)足以完成大多數(shù)編程任務(wù),包括移位、求余和比較。
還有很多的內(nèi)容需要學(xué)習(xí)
“對(duì)話 Unix已經(jīng)是第 13 部分了,但是仍然有許多內(nèi)容需要介紹。我們需要學(xué)習(xí)更多的命令和技巧、研究各種各樣的相關(guān)概念,當(dāng)然還包括大量的開(kāi)放源代碼軟件,以便提高您的工作效率。
還有一點(diǎn)就是,必須克服各種困難。高年級(jí)學(xué)生有時(shí)會(huì)捉弄人,有時(shí)的確令人尷尬,但他們相處融洽。也許我看起來(lái)像是在倚老賣老了!. . 孩子們相處很融洽,是吧!
感謝您的閱讀!我希望您能夠喜歡本專欄。
相關(guān)文章:
1. 對(duì)話 UNIX,第 9 部分: 正則表達(dá)式2. 對(duì)話 UNIX: !$#@*%3. 對(duì)話 UNIX,第 8 部分: UNIX 進(jìn)程4. 對(duì)話 UNIX,第 5 部分: 操縱數(shù)據(jù)與文件5. 對(duì)話 UNIX: 掌握強(qiáng)大的命令行6. 對(duì)話 UNIX: 更多 shell 腳本技術(shù)7. 對(duì)話 UNIX,第 11 部分: 漫談 UNIX 文件系統(tǒng)8. 對(duì)話 UNIX: 在 Windows 上使用 Cygwin9. 對(duì)話 UNIX:第 2 部分: 做得多不如做得巧10. 對(duì)話 UNIX,第 7 部分: 命令行慣用語(yǔ)
