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

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

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

コマンドラインにを入力すると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。ファイルが現在のディレクトリにある場合、ファイルへのフルパスは必要ありません。

おすすめ記事