• ベストアンサー

Bashシェルスクリプト findのエイリアスに引数を渡すにはどうすれ

Bashシェルスクリプト findのエイリアスに引数を渡すにはどうすれば良いのでしょうか? $ alias a="ls $1 -a" $ a dir . .. ls_nara_ok $ alias a="find $1 -type d" $ a dir find: pathes must precede expression: a lsではうまく行くのに、findではエラーとなってしまいます。 どうすればスクリプト(エイリアス)内のfindに引数を渡せるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

いや、ls も うまくいってないです。 コマンドラインから > alias a="ls $1 -a" とした時点で""が展開されます。 $1には何も入っていない(echo $1 としてみればわかる)ので、この文は alias a="ls -a" となります。 a dir として ls dir -a を実行してるつもりなのでしょうが、 実際には ls -a dir が実行されています。 (linux等で採用されている)GNUのlsでは ls dir -a でも ls -a dir でも同じ表示になるので「正しい」と思ったのでしょう。 lsの正式な書式は「 ls [OPTION ...] [FILE ...] 」であり、他のlsでは、一つでもファイル/ディレクトリ名と認識されたら、それ以降の引数は-で始まっていてもファイル/ディレクトリ名と判定されます。よって ls dir -aは ls: -a: No such file or directory となります(-aというファイルが無い場合) bashでは、aliasの途中に引数を渡すようなことはできません。 そのような使いかたをするなら、functionで定義したり、シェルスクリプトにしたりしてください。

gotoumak
質問者

お礼

ありがとうございます! 詳しくご解説いただきまして、よくわかりました。 ありがとうございました!!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.2

findの構文間違えてません? パス(ディレクトリ)が無いと、指摘されてますよ。 find http://www.linux.or.jp/JM/html/GNU_findutils/man1/find.1.html エラーメッセージ訳しただけですけど。

gotoumak
質問者

お礼

質問文のエラーメッセージ間違えてました > find: pathes must precede expression: a > find: pathes must precede expression: dir です

全文を見る
すると、全ての回答が全文表示されます。
  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.1

alias a='find -type d' で a dir ではいかが。

gotoumak
質問者

お礼

$ a dir find: pathes must precede expression: dir

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Bashシェルスクリプトの書き方

    Bashシェルスクリプトの書き方 ↓のx.shはどこが間違っているのでしょうか? $ cat x.sh #!/bin/bash function x() { local dir if $1; then dir=$1 else dir="." fi `find $dir -type d` } ↓こうなります $ source x.sh $ x dir dir: command not found bash: .: ./dir: はディレクトリです

  • bashのaliasに引数を渡すには?

    sshでログインしたubuntuサーバー上で時間のかかるシェルスクリプト(例えば hoge.sh) を実行した後、sshから抜けてもプロセスを走り続けさせるためにnohupを使っています。 nohup hoge.sh > out.log 2> err.log < /dev/null & これはタイプ量が多いし、時間のかかるシェルスクリプトはhoge.shだけではないので、実行したいシェルスクリプトの名前の部分を引数にした下記のようなエイリアスを作りたいのですが、bashのaliasには引数が渡せないとの事です。 alias run='nohup $1 > out.log 2> err.log < /dev/null &' "alias 引数"で検索すると「関数を使うと良い」というページがいくつか見つかりますが、関数ではsshから抜けると終了してしまいます。どうするのが良いでしょうか?

  • cygwinシェルスクリプト内でのエイリアス

    cygwinのterminal上で alias abc=ls abc とやるとlsを実行したことになるのですが、 内容が #!/bin/bash alias abc=ls abc のa.shというシェルを作り実行すると、 ./a.sh: line 3: abc: コマンドが見つかりません というエラーが出て実行してくれません。 解決策が分かる方よろしくお願いします。

  • シェルスクリプトの引数について

    test.sh '*.c' といったコマンドを入力した時に、 シェルスクリプト内で引数$1を受け取ったときに$1='*.c'となるのではなく、 カレントディレクトリ内にある'*.c'の正規表現にマッチするファイルが入ってしまっています。 例)カレントディレクト内にaaa.cファイルbbb.cファイルといったファイルがある時は、 $1=aaa.c bbb.cとなっています。 '*.c'の正規表現自体をシェルスクリプト内で受け取る方法はないのでしょうか? シェルはbashを使用しています。

  • シェルスクリプト 引数の引渡しについて

    こんにちは。現在シェルスクリプトを勉強中なのですがどうしてもわからないことがあり投稿させていただきました。 シェルスクリプトにて作成した引数(引数にスペースがある場合)を別のシェルスクリプトへ渡そうとしたときにうまく引き渡せなくて困っています。 詳しくは以下のスクリプト参照願います。 (1)引数作成のスクリプト _/_/_/_/_/_/_/_/_/_/_/_/ #!/bin/sh a="HELLO" b="\"WOW WOW\"" test.sh $a $b _/_/_/_/_/_/_/_/_/_/_/_/ (2)test.sh _/_/_/_/_/_/_/_/_/_/_/_/ #!/bin/sh echo $1 echo $2 echo $3 _/_/_/_/_/_/_/_/_/_/_/_/ これを実行すると $1=HELLO $2="WOW $3=WOW" となってしまいます。 これを $1=HELLO $2=WOW WOW $3=NULL(空欄) となるようにシェルスクリプトで作成することはできないのでしょうか? ご教授よろしくお願いします。 よろしくお願いします。

  • シェルスクリプト間で排他をとりたい

    環境 linux(redhat) 使用シェル bash シェルスクリプトAとシェルスクリプトBを作成し、 シェルスクリプトAが動作している間は、シェルスクリプトBの動作を禁止したいと考えています。 例えば、シェルスクリプトAが起動している状態で、シェルスクリプトBが起動されたとき、シェルスクリプトBは、シェルスクリプトAが起動していることを検知して、自発的に処理を終了するようにしたいと考えています。 上記のような仕組みをシェルスクリプトで実現可能でしょうか? 基本的には、シェルスクリプトの先頭で、ある資源のロックを行い、終了時にロックの解放ができれば、その仕組みは実現可能と考えています。 (シェルの異常終了時は、ロックが自動的に解放されることが望ましい) 上記のようなことをシェル(bash)で実現可能でしょうか。 bash単独での方法、もしくはbashからperl,C言語作成の実行モジュールを呼び出す方法でもかまいません。 (ちなみにperl(もしくはC言語作成のモジュール)単独では実現可能なことはわかっています)

  • shのシェルスクリプトの演算方法について・・・

    bashのシェルスクリプトについてもお聞きしたのですが、 その方法では演算ができない!ということになってしまいました・・・ こういうちょこっとしたところが違うのが嫌です・・・↓ bashの場合は ---------- bash$ a=1 bash$ a=$(( $a + 1 )) bash$ echo $a 2 ---------- となったのですが、shではエラーが出てしまいました・・・ また、shのスクリプトもbashのスクリプトもシェルスクリプトと呼ぶのでしょうか?

  • シェルスクリプトの記載方法

    linuxでシェルスクリプトを書いています サーバ上に「日付のついた*.bak」ファイルが毎日できています これを3日以上経過した*.bakファイルを消去したいので直接 コマンドラインから次のようにキーボードでたたくと正常に消去できます find /root -name '*.bak' -mtime '+3' -exec rm -f {} \; これをシェルスクリプト(sakujyo.bash)として次のように記載し /rootの中におきました ================(sakujyo.bash)===================== #!/bin/bash find /root -name '*.bak' -mtime '+3' -exec rm -f {} \; =================================================== そして # sakujyo.bash と打鍵すると 次のようにエラーとなります -bash: sakujyo.bash: command not found findのpathが通ってないのかとも考えられるのですが・・・ findコマンドは /usr/bin/ の中にあるので次のように記載してみました =================================================== #!/bin/bash cd /usr/bin find /root -name '*.bak' -mtime '+3' -exec rm -f {} \; ==================================================== このようにしても同じエラーとなります 記載方法等教えていただけませんか よろしくお願いします。

  • シェルスクリプト(Bash偏)の実行ファイルに関するご質問があります。

    シェルスクリプト(Bash偏)の実行ファイルに関するご質問があります。 ファイル名を変更するシェルスクリプトをbashで行おうとプログラムを作成したのですが、 実行するとbad interpreter: ディレクトリではありません とメッセージが出て終了します。記述に誤りがあるのか、実行の仕方が悪いのか分かりません。教えて下さい。 シェルの記述内容は ファイル名をtest.sh #!/bin/bash/ -f mv A.txt A.ori exit 実行方法として #>chmod x+a test.sh #>./test.sh で行いました。そうしたら、bad interpreter: ディレクトリーではありません とメッセージが出ます。 ちなみに #>. test.sh で実行するとターミナルがシェルの実行と同時に閉じてしまいますが、シェルを実行したディレクトリーを確認すると、処理が終わっておりました。

  • shellスクリプトに複数の引数を渡したい

    shellスクリプトに複数の引数を渡したいと考えています。 下記のようなperlスクリプトを兼ねる事でやりたいことは達成できました。 これをシェルスクリプトだけでやろうとしていて、ハマってしまい、やり方がわからなかったので、質問しています。 ・echo.shの中身 $ cat echo.sh echo $1 $2 ・imglist.plの中身 $ cat imglist.pl my@imglist= `ls -1 *{.gif,.bmp,.jpg,.jpeg,.png} 2>1&`; foreach(@imglist){ my@name=split /\./,$_; system("bash ./echo.sh $name[0] $name[1]"); } ・実行すると、無事echo.shに引数が2つ渡る。 $ perl imglist.pl abc1 jpg abc10 png abc11 png abc2 jpg abc3 jpg これをシェルのみでやろうとして、はまってしまいました。 以下は、パイプ処理等を使ったりしてやってみたのですが出来ませんでした。 ・awkでファイル名と拡張子に分解し、パイプで渡そうとしても何故か渡らない・・ $ ls -1 *{.gif,.bmp,.jpg,.jpeg,.png} | awk -F . '{print $1,$2}'| bash ./echo.sh ・ファイルに一旦保存し、catコマンドでパイプで渡しても駄目 $ ls -1 *{.gif,.bmp,.jpg,.jpeg,.png} | awk -F . '{print $1,$2}' > imglist.txt $ cat imglist.txt | bash ./echo.sh ・echoコマンドを使ってパイプで渡しても駄目 $ echo `cat imglist.txt` |bash ./echo.sh ・for.shというファイルを作成し、for構文でimglist.txtの中身を渡すと引数が一つずつしか渡らない $ cat for.sh for id in $(cat imglist.txt); do echo $id done $ bash for.sh tile1 jpg tile10 jpg どうやれば、コマンドライン上やシェルスクリプトだけで、今回はファイル名と拡張子という形で複数行からなる2つの引数を渡すことができますでしょうか

    • ベストアンサー
    • Perl