簡単にするために、別名を使用してコマンドを指定してみました。
php artisan route:list | (head -n 3; grep checkout)
このコマンドはテーブルのタイトルを表示し、パスを検索します。結果は次のとおりです。
+--------+----------+--------------------------------------------+----------------------------------------------------+-------------------------------------------------------------------------------+------------------------------------------------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+----------+---------------------------------------------+----------------------------------------------------+-------------------------------------------------------------------------------+------------------------------------------------------+
| | POST | profile/auctions/checkout | user-portal-profile-auctions-checkout | xxxxxxxxxxxxxxxx | web,auth |
| | POST | profile/deals/checkout | user-portal-profile-deals-checkout | xxxxxxxxxxxxxx | web,auth |
| | POST | profile/quotes/checkout | user-portal-profile-quotes-checkout | xxxxxxxxxxxxxxx | web,auth |
これが私が持っているものです~/.bash_profile
:
alias findRoute='php artisan route:list | (head -n 3; grep $1)'
しかし、引き続き次のエラーが発生します。
bash: syntax error near unexpected token `checkout'
何を提供しますか?なぜ私の主張を受け入れないのですか?
渡すパラメータに一重引用符と二重引用符を使用してみました。
エイリアスに一重引用符と二重引用符を使用してみました。何も変わりません。
答え1
エイリアス拡張は、単にテキスト置換とシェルによる別の解析ラウンドです。
入ると
findRoute checkout
まず、次に展開してください。
php artisan route:list | (head -n 3; grep $1) checkout
結果は再びシェルコードに解析される。ここのシェルコードは無効です。
ここではスクリプトまたは関数を使用できます。良い:
findRoute() {
php artisan route:list | {
head -n 3
grep -e "$1"
}
}
ほとんどの実装はブロック全体を読み取るhead
ため、3行だけを出力しても3行以上を読み取ることができることに注意してください。head
つまり、grep
部分は見えません。
sed
GNU実装がある場合はhead -n3
thisに置き換えることができますsed -u 3q
。sed
ここでは、入力は一度に1バイトずつ読み取られ、3番目の改行文字を通過するのを防ぎます。
または、次のものを使用できますawk
。
findRoute() {
php artisan route:list |
PATTERN=$1 awk 'NR <= 3 || $0 ~ ENVIRON["PATTERN"]'
}
注意する(Beware)$1
は次のように解釈されます。拡大するgrep -E
代わりに正規表現(例:for)基本的な1つ(ありますかgrep
?-E
)部分文字列検索(例grep -F
:)の場合は、次のように置き換えます。
findRoute() {
php artisan route:list |
PATTERN=$1 awk 'NR <= 3 || index($0, ENVIRON["PATTERN"])'
}