注:私のシェルはcshです。
以前の同僚が私に次のような命令を出しました.cshrc
。
alias bastion 'ssh -L \!^\:<some_ip_address> <username>@<something.com>'
<>間の内容は実際の値です。
シェルでこのコマンドを実行すると、次のエラーが発生します。Bad ! arg selector.
同様の使用法をオンラインで検索しましたが、以前に使用した構文を使用した例がssh -L
見つかりませんでした。\!^\
:
このコマンドが実際にやろうとしていることが何であるか、なぜ機能しないのか知っていますか?
答え1
私はcshユーザーではありませんが、これは歴史的な制御のようです。
!^
前のコマンドの最初の引数を提供します。これはと同じです!:1
。開始履歴引数は、^
(カラット)が正規表現(26.4)の行開始アンカーと同様に提供されることを覚えておいてください。!^
% cat fn fn1 fn2 ... % more !^ more fn
https://docstore.mik.ua/orelly/unix/upt/ch11_07.htm
\
(私の考えでは)は、早期の!^
解釈を防ぐためにエスケープされます(例えば、別名を定義するのではなく使用するとき)。例を見るここ。
したがって、これはデフォルトでエイリアスのパラメータ処理を実装します。エイリアスは、バインドされたローカルポート番号を使用して呼び出されます。
$ bastion 8080
# should be executed as
$ ssh -L 8080:<some_ip_address> <username>@<something.com>
$ bastion 8080 some argument
# is probably (I'm still no csh user) executed as
$ ssh -L 8080:<some_ip_address> <username>@<something.com> some argument
結論として、ポートパラメータなしで実行しようとしているBad ! arg selector.
ので、選択するパラメータがないことを意味します。bastion
1代替品が<some_ip_address>
実際にIP+ポートであると仮定していますか?そうでなければ、-L
議論は少し奇妙になるでしょう。