コマンドを直接使用することと$(foo)を使用することの間で混乱しています。私はMacを使用しておりbrew cask
(パッケージマネージャ)がインストールしたアプリケーションを一覧表示し、各アプリケーションをエコーしようとしています。 2つの短いシェルスクリプトがあり、最初のスクリプトは次のとおりです。
#!/bin/bash
apps=$(brew cask list)
for app in ${apps}
do
echo "${app}"
done
うまくいきますが、別のものは次のとおりです。
#!/bin/bash
apps=$(brew cask list)
myecho=$(echo)
for app in ${apps}
do
${myecho} "${app}"
done
これによりアプリケーション名./script2.sh: line 7: foo: command not found
が返されます。foo
echoを直接使用することとエイリアスとして使用することのmyecho
違いは何ですか?
答え1
このコマンドでは
myecho=$(echo)
myecho
空のトークンを設定しています。だから次のコマンド
${myecho} "${app}"
簡単に言えば"${app}"
、これは明らかに「foo」です(予想されていません)。一つ作ってくれる?ニックネーム別の構文を使用してください。
alias myecho="echo"
追加資料:
- 2.3.1 エイリアスの置換(POSIX)
- 2.6.3 コマンドの置換(POSIX、
$(
使い方説明)
答え2
エイリアスを設定していません。で実行されmyecho=$(echo)
、echo
その出力(echoにはエコーする項目がないため何もありません)が変数に保存されますmyecho
。しかし、echoのいくつかの出力は次のとおりです。
$ myecho=$(echo "Hello")
$ echo "$myecho"
Hello
そして変数はmyecho
それを保存します。
2番目のスクリプトで欲しいのは、echo
変数を使って実行することだと思いますmyecho
。実行方法は次のとおりです。
#!/bin/bash
apps=$(brew cask list)
myecho="echo"
for app in ${apps}
do
${myecho} "${app}"
done
上記の内容はすべてエイリアスとは関係ありません。エイリアスは次のように定義されます。
alias myecho='echo'
ただし、エイリアシングを実行する行には次のものを含めないでください$
。
myecho "${apps}"