フルパスを含むパラメータを使用する単純なエイリアスを作成しようとしています。
コマンドラインにを入力すると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
。ファイルが現在のディレクトリにある場合、ファイルへのフルパスは必要ありません。
答え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
(参照されていない拡張によって引き起こされる可能性のあるすべての問題を含む)
代わりに関数を使用してください。
望むより: