フルパスを含むパラメータを使用する単純なエイリアスを作成しようとしています。
コマンドラインにを入力するとcommand "$(pwd)/my_file"
機能します。それで、次のようにエイリアスを作成してみました。
alias command='command "$(pwd)/$1"'
ただし、エイリアスは機能しません。 CLIは、あたかも別のパラメータであるかのように解釈します$(pwd)
。これを使ってコマンドを単一のコマンドに変換してみmy_file
ました。eval
alias command="eval 'command' '$(pwd)/$1'"
しかし、初期パラメータを受け入れるのではなく、入力パラメータを待ち続けています...
私が意味するものを試したい場合はcommand
(evince
人気のPDFビューア)をmy_file
PDFファイルに置き換えてください。だから私のニックネームは
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.pdf
2つのウィンドウが表示されます。
関数は次のとおりです。
evince(){
command evince "$(pwd)"/"$1"
}
注:の使用は、関数が内部的に呼び出されるようにするcommand
ことです。evince
注文する evince
関数自体が再帰的ではありません。また、これはevince foo
それ自体とまったく同じであるため、無意味な例であることに注意してくださいevince $(pwd)foo
。ファイルが現在のディレクトリにある場合、ファイルへのフルパスは必要ありません。