以下を実行するためにbashエイリアスを作成しようとしています。
- フォルダの作成(現在の日付をフォルダ名として使用)
- 現在のフォルダから新しいフォルダにファイルを移動(またはコピー)します。
ファイル名はエイリアスに変数として渡されます。例えば、my-alias file.txt
以下は私が試したいくつかのことです(もっと多くのバリエーションを試しましたが)。
alias my-alias="mkdir -v -p '$(date +%F)-List' && cp $1 './$(date +%F)-List/$1' && cd '$(date +%F)-List'"
alias my-alias="mkdir -v -p '$(date +%F)-List' && cp $1 ./$(date +%F)-List/$1 && cd '$(date +%F)-List'"
alias my-alias="mkdir -v -p '$(date +%F)-List' && cd '$(date +%F)-List' && cp ../$1 ./$1"
コマンドを書くためのいくつかの方法を試しましたが、そのうち何も機能しません。
私は何を見ていますか?
これはMacオペレーティングシステムにあり、他のほとんどのLinux環境と同じである必要があります。
更新:私はどこで間違っていますか?
私はどこで混乱しているのか気づきました。私はパラメータを受け取るように見える多くのエイリアスを設定しました。私はずっと前に(数年前)それらを設定しました。エイリアスはコマンドラインに入力したときに次のものをすべて処理できるため、エイリアスは引数だけを受け入れるように見えました。ただし、エイリアスが参照するコマンド文字列の末尾にある「引数」のみが同じ順序で処理されます。したがって、エイリアスコマンド文字列のパラメータ調整が開始されるとすぐに、エイリアスは中断されます。はい。最良の方法は機能を使用することです。
答え1
エイリアスを使用する必要がある場合は、-tを使用して移動するファイルの実際の引数の前にターゲットディレクトリを指定できます。
alias my-alias="mkdir \$(date +%F); mv -t \$(date +%F)"
Linuxでは動作しますが、テストするMacOSシステムはありません。
答え2
エイリアスの代わりに関数を使用してください。エイリアスの使用に問題がある場合、ほとんど常にこれが答えです。特に$1
エイリアスは実際にはパラメータを受け入れないため、パラメータ(たとえば)を使用しようとする場合はさらにそうです。
また、パラメータと変数の参照の周りにはほぼ常に二重引用符を入れる必要があります(例:"$1"
だけでなく$1
)。そしてdate
他の結果が得られる可能性があるので、何度も実行しないでください。一度実行し、結果を変数に保存します。この試み:
my-function() {
local subdir="$(date +%F)-List"
mkdir -v -p "$subdir" &&
cp "$1" "$subdir/$1" &&
cd "$subdir"
}
答え3
他の質問への答えが示すように、エイリアスはパラメータをうまく処理できません。以下を見ることもできます。
param=foo; do something with "$param"
パラメータの動作方法は次のとおりです。まず、パラメータを設定し(時間とコマンドラインで)使用します。これの反対:
<alias string with several commands to be expanded> <parameter>
このパラメーターは、別名の最後のコマンド・パラメーターである可能性があります。それはあなたに必要なものではありません。
シェルの観点からは、別名を単一のコマンドで作成してエイリアスを使用してこれを行うことができますが、これが有用なアプローチかどうかは疑問です。
alias testalias='bash -c "echo \$1; echo \$1-" bash'
$ testalias foo
foo
foo-
これに対する1つの主張は、引用が複雑であるということです。でも、この間違いは私が最初にした。
答え4
関数を生成する必要があります。mkdir -v -p '$(date +%F)-List'
エイリアスを生成するときにのみ評価されます。