web-dev-qa-db-ja.com

スクリプトをcronジョブとして実行するための「stdin:is not atty」メール

Cronで起動するシェルスクリプト(bash)がいくつかあります。スクリプトが実行されるたびに、「stdin:is notatty」というメールが届きます。誰かがこれを修正する方法を教えてもらえますか?すべてのスクリプトは正常に実行されますが、これらのメールによってメールフォルダが強制終了されます。

私はDebianWheezyを使用しています。 「/root/.bashrc」は空です。 cronエントリは次のようなものです。

/bin/bash --login /root/script.sh > /dev/null

このスクリプトでもエラーメッセージが表示されます。

#!/bin/bash
ls

.profileの内容:

# ~/.profile: executed by Bourne-compatible login shells.

if [ "$BASH" ]; then
  if [ -f ~/.bashrc ]; then
    . ~/.bashrc
  fi
fi

mesg n
3
user4811

.bashrcの何かが、シェルが端末で実行されていることを前提としています。これはまったく問題ありません。.bashrcはインタラクティブシェルでのみ実行されることになっており、インタラクティブシェルは端末でのみ実行されることになっています。

問題は、.bashrcから.profileを体系的に含めていることです。それは間違っています。インタラクティブシェルには.bashrcのみを含める必要があります。

.profileをに変更します

# Bash doesn't load its interactive initialization file if it's invoked as
# a login Shell, so do it manually.
case $- in
  *i*) if [ -n "$BASH" ]; then . ~/.bashrc;; fi
esac

mesg n.bashrcに移動します。これは端末関連のコマンドであり、セッション関連のコマンドではありません。

.bashrcに環境変数の定義がある場合は、それらを.profileに移動します。 .profileファイルは、セッションの開始時に実行されるもの、通常は主に環境変数の定義用であり、セッション中に実行するアプリケーションによって使用されます。 .bashrcファイルは、インタラクティブに実行する場合のbashの構成ファイルであり、通常、端末のセットアップ、エイリアス定義、シェルオプションと完了設定、およびシェルのインタラクティブな使用に関連するその他のものが含まれています。

背景については、以下を参照してください。