変数に保存された切り取りコマンドは機能しません。

変数に保存された切り取りコマンドは機能しません。

カットコマンドを変数に保存できない理由を誰か説明できますか?

user:~$ echo "foo bii doo" | cut -d ' ' -f 2
bii # as expected
# now put cut command into a variable:
user:~$ c="cut -d ' ' -f 2"
user:~$ echo "foo bii doo" | $c
cut: "'": No such file or directory
user:~$ c="cut -d \  -f 2"
user:~$ echo "foo bii doo" | $c
foo bii doo

trは有効なので、これは一般的な引用の問題ではありません。

user:~$ t="tr -d 'oo'"
user:~$ echo "foo bii doo" | $t
f bii d

(私はDebian 12でbashを使用しています。)
この問題は他の方法で解決されました。なぜデバッグ時間を3時間も無駄にしたのか知りたいです:)

答え1

どのように見て、これは引用の問題ではなく、拡張の問題です。変数拡張はテキスト置換ではなく、変数から得られたデータは次のとおりです。いいえコードで解析します。これは、引用符、バックスラッシュエスケープ、または他のシェル構文が処理されないことを意味します。代わりに、拡張値は空白(すべての空白)にトークン化されます。これは、トークン化を使用して1つの文字列に複数のランダムな文字列を格納できないことを意味します。

tr使用したコマンド〜らしい引数に一重引用符を追加してもosの操作は変更されないため、機能します。 Chris Davisがコメントで述べたように、

$ t="tr -d 'oo'"
$ echo "don't forget" | $t
dnt frget

tr削除する文字のリストに引用符が含まれていることを確認できます。引数ではなく引数がtrあります。スペースを削除するには、次の問題が発生します。'oo'ootrcut

$ t="tr -d ' '"
$ echo "don't forget" | $t
usage: tr [-Ccsu] string1 string2
       tr [-Ccu] -d string1
       tr [-Ccu] -s string1
       tr [-Ccu] -ds string1 string2

、およびtr3つの引数を使用して実行しようとしましたが、これは使用方法と一致しないため、使用法ヘルプを印刷します。-d''

これを行う方法は、次の関数を書くことです。

c() {
    cut -d \  -f 2
}
echo "foo bii doo" | c

与えるbii

望むより:

関連情報