Shell-Script

除了命令子命令結構之外,Bash 還支持 command.subcommand 結構嗎?如果是,如何將其合併到 bash 腳本中?

  • May 10, 2020

在我的本地機器上安裝 microk8s (Micro Kubernetes) 後,我遇到的命令之一是microk8s.enable dns它也可以作為microk8s enable dns. 這似乎不是一個普遍的事情。git status是一個有效的命令,但git.status不是。Linux 系統如何支持這種類型的命令結構?如何將此行為合併到我的 Bash 腳本中?

您有時會看到程序(和腳本)檢查用於呼叫程序的文件的名稱並以此為條件行為。

例如考慮這個文件和符號連結:

$ ls -l
-rwxr-xr-x  ... foo
lrwxr-xr-x  ... foo.bar -> foo

以及腳本的內容foo

#!/bin/bash

readonly command="$(basename "${0}")"
subcommand="$(echo "${command}" | cut -s -d. -f2)"

if [[ "${subcommand}" == "" ]]; then
   subcommand="${1}"
fi

if [[ "${subcommand}" == "" ]]; then
   echo "Error: subcommand not specified" 1>&2
   exit 1
fi

echo "Running ${subcommand}"

該腳本解析命令名稱以查找子命令(基於您問題中的點符號)。有了它,我可以執行./foo.bar並獲得與執行相同的行為./foo bar

$ ./foo.bar
Running bar

$ ./foo bar
Running bar

需要明確的是,我不知道那microk8s.enable是在做什麼。你可以做一個ls -li $(which microk8s.enable) $(which microk8s)並比較文件。一個連結到另一個嗎?如果不是,它們是否具有相同的 inode 編號?

引用自:https://unix.stackexchange.com/questions/585579