• 締切済み
  • 困ってます

bashが評価されない

mac標準の古い/bin/bashならスクリプトしっかり動きます 新しい/usr/local/bin/bashではほとんど動きません /usr/local/bin/bash -x デバッグモードで確認すると最初と最後のみ評価されてスクリプトのほとんどが評価されていません 単純な100行程のスクリプトなのに原因がわかりません 何故評価されないのか考えられる要素はありますか

共感・応援の気持ちを伝えよう!

みんなの回答

  • 回答No.2
  • asciiz
  • ベストアンサー率71% (5988/8396)

>複数の改行コードが混じるって事あるんですか? テキストエディタのつくりによりますが、考えられます。 古いスクリプトファイル #!/bin/bash<CR> #○○スクリプト<CR> スクリプト行001<CR> スクリプト行002<CR> スクリプト行003<CR> があったとして、これを新しいエディタで編集し、1行目の変更とスクリプト追記をしたとします。 #!/usr/local/bin/bash<LF> #○○スクリプト<CR> スクリプト行001<CR> スクリプト行002<CR> スクリプト行003<CR> スクリプト行004<LF> スクリプト行005<LF> スクリプト行006<LF> これを /usr/local/bin/bash が見た場合、 #/usr/local/bin/bash<LF> #○○スクリプト<CR>スクリプト行001<CR>スクリプト行002<CR>スクリプト行003<CR>スクリプト行004<LF> ↑<CR>が<TAB>と同様の空白類と見なされて、行頭の#から次の<LF>までが丸々コメント扱い スクリプト行005<LF> スクリプト行006<LF> このように解釈してしまい、スクリプト行005と006しか実行しない、みたいな。 2行目でなくとも、どこかに行コメント開始の # があれば、次に<LF>が現れるまでの部分が無いことになってしまうでしょう。 …そんなことが起こっているのではないかなと、想像しました。 テキストエディタに、「改行コード指定保存」みたいな機能があればそれで保存しなおしてみても良いかもしれません。 Windows(DOS)テキストの改行は基本<CR>+<LF>なので、<LF>改行保存にするとちょっとだけファイルサイズが減ったりします。 Macだと<CR>が<LF>に書き換わってもバイト数は変わらないので、それでは判断つきませんが。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

これで再現されます、意味わかんない trap ' rm -f ~/file1.txt ~/file2.txt ~/file3.txt rm -rf ~/folder1 ~/folder2 ~/folder3 exit' 1 2 3 15 20 if [ `uname` = Darwin ];then echo OK fi

質問者からの補足

改行問題ありませんでした、どうやらtrapコマンドが邪魔してる様です スクリプトの最後にrmで掃除してたので最後の数行が評価されると勘違いしてました :書式 trap ' rm -f ~/file1.txt ~/file2.txt ~/file3.txt rm -rf ~/folder1 ~/folder2 ~/folder3 exit' 1 2 3 15 20 :MacOS10.13 /bin/bash --version GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin17) Copyright (C) 2007 Free Software Foundation, Inc. 問題なく動きます /usr/local/bin/bash --version GNU bash, バージョン 5.1.8(1)-release (x86_64-apple-darwin17.7.0) Copyright (C) 2020 Free Software Foundation, Inc. ライセンス GPLv3+: GNU GPL trapで止まります : Linux /bin/bash --version GNU bash, バージョン 5.0.17(1)-release (x86_64-pc-linux-gnu) Copyright (C) 2019 Free Software Foundation, Inc. 問題なく動きます 一般的な表現教えて下さい

  • 回答No.1
  • asciiz
  • ベストアンサー率71% (5988/8396)

古いOSと新しいOSのバージョン、実行しようとしているスクリプト、を出した方が良いと思うのですが。 昔のMacOS(9以前)は改行=CR(0x0D)、今のMacOS(10以降、BSD UNIXベース)は改行=LF(0x0A)だそうです。 でも/bin/bashはそれも考慮していて、CRも改行として見ますけど、/usr/local/bin/bash はLFしか改行と見ていないのかもしれません。 そうすると、古いスクリプトファイルを/usr/local/bin/bashで実行しようとした場合、そのスクリプトは巨大な1~2行のコメントファイルとして見えている可能性があります。 新たに書いた数行のスクリプトは実行できますか? 一度テキストエディタに読み込み、保存しなおしてみて、どうでしょうか? バイナリエディタでスクリプトファイルを読み込んでみて、改行コードは何になっていますか?

共感・感謝の気持ちを伝えよう!

質問者からの補足

MacOSは同じ10.13です 標準の/bin/bash で実行すると全て評価されます 新しい/usr/local/bin/bash -x でデバッグすると冒頭数行評価されあいだを抜いて最後の数行が評価されます もちろんエラーすらでません 複数の改行コードが混じるって事あるんですか? 手元にmac無いんで帰宅後確認してみます

関連するQ&A

  • bashスクリプトについて

    #!/usr/local/bin/bash など1行目に書いてbashのスクリプトを作成したいのですが、 計算式を作りたいのですができないものでしょうか? たとえばe2pという名前で ###----------------### echo "script test" $i=1 printf $i ###----------------### として、./e2pと実行しても、script test は表示されても、以下二行はエラー ./e2p: =1: command not found ./e2p: print: command not found となって表示されませんでした。 どのようにすれば、 $a=1 $b=3 print $a+b などいったことができるのでしょうか? また、根底から間違っている気もします・・・どのようにすればよろしいでしょうか?

  • シェルスクリプトの1行目

    シェルスクリプトの1行目に#!/bin/bashと書くと思うのですが 環境によってbashのパスが違うのですが、そのような場合は2つ書くことは可能でしょうか? 例えばLinuxなんかは#!/bin/bashですよね? Macだと#!/bin/bashだと3系なので古いので5系をインストールすると#!/usr/local/bin/bashになるんです 1台のパソコンで使ってる分には問題ないですが他の環境で使う場合2つ書くにはどうしたら良いでしょうか?

  • #!/bin/gawk -f ???スクリプトの一行目

    bashのスクリプトの一行目に、環境に合わせて、 #!/bin/gawk -f とか #!/usr/local/bin/bash -f とか書かないとだめですよね。 環境が変わるごとに(bashのパスが変わるごとに)この部分を書き換えるのが面倒なのですが、よい方法はないものでしょうか?

  • 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: はディレクトリです

  • #!/bin/bash のラインでエラー発生

    お世話になります。 Linux初心者です。 下記のような***.shを作成し、./***.sh で実行すると、/bin/bash^M bad interperter: No such file or directory というエラーが発生してしまいます。 原因として考えられる事をご教授頂けないでしょうか? --------------------------------------- #!/bin/bash PATH=/usr/local/bin:/bin:/usr/bin for conf in /etc/webalizer*.conf do ~ ---------------------------------------

  • bashシェルスクリプトで空白がある場合のコマンドは変数にどう記述したらいいのでしょうか?

    bashのシェルスクリプトで #!/bin/bash -x CMD=/bin/service portmap restart;/bin/service nfslock restart;/bin/service nfs restart $CMD としたのですが2行目で既にコマンドが実行されてしまいます。 空白がある場合のコマンドは変数にどう記述したらいいのでしょうか?

  • ~/.bash_profileがログイン時に反映されないのはなぜ?

    LINUX系OS全般的に初心者です。 TeraTermを使いサーバにTelnet接続し、~/home/(ユーザ名)パスの下に .bash_profileファイルを以下の内容で作成しました。 export PATH=/usr/local/pgsql/bin:$PATH (この1行のみ) そして、再度同ユーザでログインしても/usr/local/pgsql/bin が$PATHに追加されていません。 source ~/.bash_profileを実行すると追加が成功することから どうやら.bash_profileの内容自体には問題ないようなのですが、 ログイン時に反映されないのはなぜでしょうか? お分かりになる方、どうかご教授ください! ちなみに、echo $HOMEの内容は確認済みで、 $HOME = 'home/(ユーザ名)'となっています。 なので、ファイルの置き場所も間違ってはいないと思うのですが? よろしくお願いいたします。

  • PostgreSQLをCentOS5にインストールしました。

    閲覧有難うございます。 質問内容なのですが、Postgresqlをインストールしたのですがpostgresql.confとpg_hba.confが見つかりません。 OSはCentOS5です。 インストール方法は以下の手順で行いました。 # /usr/sbin/adduser postgres # chown postgres:postgres /usr/local/pgsql # mkdir /usr/local/src/postgres-8.2.6 # chown postgres:postgres /usr/local/src/postgresql-8.3.7 # su - postgres # cd /usr/local/src # tar xfz /usr/local/src/postgres-8.2.6.tar.gz # cd /usr/local/src/postgres-8.2.6 # ./configure # make # make install また、 [root@ ~]# su - postgres -bash:  LD_LIBRARY_PATH=/usr/local/pgsql/lib: そのようなファイルやディレクトリはありません -bash:  export: command not found -bash:  PATH=/usr/local/pgsql/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin: そのようなファイルやディレクトリはありません -bash:  export: command not found -bash:  MANPATH=/usr/local/pgsql/man:: そのようなファイルやディレクトリはありません -bash:  export: command not found -bash:  export: command not found -bash:  PATH=/usr/local/pgsql/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin: そのようなファイルやディレクトリはありません -bash:  export: command not found -bash:  MANPATH=/usr/local/pgsql/man:: そのようなファイルやディレクトリはありません -bash:  export: command not found [postgres@ ~]$ のようなエラーがはかれるようになりました。 どうか皆様のお力をお貸しください。

  • Apacheをデバッグモードで起動したのですが。

    Apacheを次のようにしてデバッグモードで起動したのですが、デバッグログが空でした。デバッグの方法が悪いのでしょうか? Apacheのデバッグログをファイルに書き出す方法を教えていただけませんでしょうか。 # pwd /usr/local/apache2/bin # ./httpd -k start -X > /tmp/1

  • UNIXのbashエラーでnot a valid

    UNIXのbashエラーでnot a valid identifer 初心者で勉強不足での質問となるかもしれませんが、どうか一緒に考えてくださると助かります。 また説明不足になるかもしれませんので状態など説明不足の点がありましたらご指摘下さい。 本題ですが、Mac os x 10.7上で付属のrubyをアップデートしようとしました。 こちらの方の記事を参考に http://nick.hateblo.jp/entry/20110120/1295544773 上記URLの通りに作業を行っていたのですが 最後に間違ったパスを通してしまい、 一度ターミナル(UNIX)を終了したのですが、 今度はターミナルを開いた瞬間に -bash: export: ' :/opt/local/bin:/opt/local/sbin:/opt/local/bin:/opt/local/sbin:/opt/local/bin:/opt/local/sbin:not a valid identifier というのが表示されるようになり、 lsコマンドやcdコマンドを行うこともsu -を行うことも出来なくなりました。 -bash: ls: command not found このエラーが返ってきます。 どのような原因が考えることが出来、またどのような対処を行うことが出来ますか? 大変なことをしでかしたのではないかと冷や汗です。 どうか宜しくお願いします。