題 Bash:別名中的空格


我試圖在bash中創建一個別名。我想做的是地圖 ls -la 至 ls -la | more

在我的.bashrc文件中,這是我嘗試的:

alias 'ls -la'='ls -la | more'

但是它不起作用,因為(我假設)它在別名中有空格。有沒有解決這個問題?


98
2018-02-05 22:35


起源


為什麼不呢 alias lsm='ls -la | more' - Nifle


答案:


Bash文檔 聲明“對於幾乎所有目的,shell函數優先於別名。”這是一個替換的shell函數 ls 並導致輸出通過管道輸送到 more 如果參數由(僅)組成 -la

ls() {
    if [[ $@ == "-la" ]]; then
        command ls -la | more
    else
        command ls "$@"
    fi
}

作為單線:

ls() { if [[ $@ == "-la" ]]; then command ls -la | more; else command ls "$@"; fi; }

自動輸出管道:

ls -la

104
2018-02-05 23:13



你為什麼需要在if語句中使用雙括號? - sixtyfootersdude
@sixtyfootersdude:雙括號形式更強大,我習慣使用它。看到 mywiki.wooledge.org/BashFAQ/031 - Dennis Williamson
那最後的命令是什麼? alias ls ='ls()'?? - Jeef
@Jeef:不,我的回答使用了一個函數 代替 別名我編輯它是為了讓它更清晰。 - Dennis Williamson
@merlinpatt: command 阻止函數被遞歸調用。 - Dennis Williamson


來自 別名手冊頁

每個簡單命令的第一個字,   如果沒有引用,則檢查是否存在   有一個別名。如果是這樣,那個詞是   替換為別名的文本。該   別名和替換文本   可能包含任何有效的shell輸入,   包括shell元字符,用   別名可以例外   不包含`='。

因此,只檢查第一個字的別名匹配,這使得多字別名不可能。您可以編寫一個shell腳本來檢查參數,並在它們匹配時調用您的命令,否則只調用法線 ls (看到 @Dennis Williamson的回答


45
2018-02-05 22:47



+1用於解釋為什麼我不允許使用ls -la作為別名。 - sixtyfootersdude
這很有幫助,因為它不是試圖解決它,而是回答了這個問題。我來到這裡是因為我想在其中創建一個帶有空格的別名,這是不會發生的。 - angryundead


從Dennis的回答中略微改進的方法:

function ls() {
  case $* in
    -la* ) shift 1; command ls -la "$@" | more ;;
    * ) command ls "$@" ;;
  esac
}

或者單行:

function ls() { case $* in -la* ) shift 1; command ls -la "$@" | more ;; * ) command ls "$@" ;; esac }

例如,如果需要,這允許在命令之後附加更多選項/參數 ls -la -h


13
2017-09-26 12:42



如果我想要,它如何處理 ls -lat 被排除在這種治療之外?我需要提出一個案例來處理它 -la* 進入,是嗎? - Steven Lu


您仍然可以調用此別名,但需要引用才能使空格成為命令字的一部分。所以 "ls -la" -p pattern 將通過 -p pattern 選項 more不是 ls


-2
2018-02-05 23:34