エイリアスで複数のパラメータを評価する方法は? [コピー]

エイリアスで複数のパラメータを評価する方法は? [コピー]

フルパスを含むパラメータを使用する単純なエイリアスを作成しようとしています。

コマンドラインにを入力するとcommand "$(pwd)/my_file"機能します。それで、次のようにエイリアスを作成してみました。

alias command='command "$(pwd)/$1"'

ただし、エイリアスは機能しません。 CLIは、あたかも別のパラメータであるかのように解釈します$(pwd)。これを使ってコマンドを単一のコマンドに変換してみmy_fileました。eval

alias command="eval 'command' '$(pwd)/$1'"

しかし、初期パラメータを受け入れるのではなく、入力パラメータを待ち続けています...

私が意味するものを試したい場合はcommandevince人気のPDFビューア)をmy_filePDFファイルに置き換えてください。だから私のニックネームは

alias evince="evince $(pwd)/$1"

私が知る限り、$(pwd)そうです/home/tapyu/Downloads/。そしてmy_fileはいrecap.pdf。私はevinceが2つのウィンドウをポップアップするので、それを別々のパラメータとして扱うことを知っています。最初のウィンドウはrecap.pdf正しく開きます。 2 番目は警告が表示された空のウィンドウです。"Error opening file, /home/tapyu/Downloads/ is a directory."

よろしくお願いします。

PS:私はこの「質問」が言葉にならないことを知っています。私の質問は、「コマンドにフルパスを提供する方法」ではなく、「この状況を解決するためにエイリアスの入力パラメータを処理する方法」です。したがって、完全なパスを提供するために代替を使用したくないのですが、なぜ私のエイリアスが機能しないのか疑問に思います。

答え1

最初の問題は、エイリアスがパラメータを使用しないことです。パラメーターを別名に渡す必要がある場合、これは次のことを意味します。関数を使用する必要があります。。次のコマンドを実行すると、何が起こるかを確認できますset -x

$ alias evince="evince $(pwd)/$1"
$ set -x
$ evince a.pdf
+ evince /home/terdon/foo/ a.pdf

ご覧のとおり、コマンドはevince a.pdf次のとおりですevince /home/terdon/foo/ a.pdf(ディレクトリから実行します/home/terdon/foo/)。だからどうしたの?あなたのエイリアスが実際に何であるかを確認してください。

$ type evince
evince is aliased to `evince /home/terdon/foo/'

set -xエイリアスを実行して定義すると、これが発生することがわかります。

$ alias evince="evince $(pwd)/$1"
++ pwd
+ alias 'evince=evince /home/terdon/foo/'

エイリアスを定義すると、$1値がなく、pwdエイリアスを設定する前に実行されるため、実際にエイリアスをとして指定しますevince /home/terdon/foo/。その後、実行するとevince a.pdf実際に実行されるため、evince /home/terdon/foo/ a.pdf2つのウィンドウが表示されます。

関数は次のとおりです。

evince(){
    command evince "$(pwd)"/"$1"
}

注:の使用は、関数が内部的に呼び出されるようにするcommandことです。evince注文する evince関数自体が再帰的ではありません。また、これはevince fooそれ自体とまったく同じであるため、無意味な例であることに注意してくださいevince $(pwd)foo。ファイルが現在のディレクトリにある場合、ファイルへのフルパスは必要ありません。

答え2

エイリアスはパラメータを使用せず、単なるテキスト置換にすぎません。 (シェルの他のすべてとは異なります。)エイリアスが$1定義または使用されるコンテキストの最初の位置引数があります。ただし、インタラクティブシェルは空になる可能性があります。


正確に何が起こるかは、エイリアスを定義するときに使用する引用符によって異なります。

お持ちの場合

alias evince="evince $(pwd)/$1"

拡張され$(pwd)$1すぐに拡張されます(二重引用符内にあるため)。$(pwd)この時点で作業ディレクトリに展開され、$1現在のシェルの最初の位置引数(コマンドライン引数)が何もないことがあります。だからあなたは次のようなものを得るでしょう:

alias evince="evince /some/path/"

その後evince foo.pdf実行

evince /some/path/ foo.pdf

実際には2つのパラメータがありますevince


一方、もし

alias evince='evince $(pwd)/$1'

拡大するいいえすぐに拡張してください。ただし、エイリアスを使用する場合にのみ可能です。実行はevince foo.pdf次に拡張されます。

evince $(pwd)/$1 foo.pdf

$(pwd)作業ディレクトリはどこにありますかまだ空$1の可能性があるシェルの最初の位置引数です。あなたは再び得る

evince /current/path foo.pdf

(参照されていない拡張によって引き起こされる可能性のあるすべての問題を含む)

代わりに関数を使用してください。

望むより:

関連情報