シェルスクリプトからcondaコマンドを活用したいとき

シェルスクリプトからcondaコマンドを活用したいとき

こんにちは!

今日はみんな大好きcondaコマンドについてです。
condaコマンドで仮想環境に入って、何らかの処理をして、戻ってくる ようなシェルスクリプト、バッチタスクをやるときのTipsです。

AI開発において、Anacondaとその中核であるcondaパッケージマネージャーはとっても重宝します。
しかし、シェルスクリプトから自動的にcondaを利用しようとすると、意外なハードルがあります。

本記事では、シェルスクリプトからcondaコマンドを正しく呼び出す方法について解説します。

condaと非対話モードの課題

AnacondaがインストールされているLinux環境において、condaコマンドは通常、.bashrc.bash_profileなどの設定ファイルによって初期化されます。

なんとなくシェルをつかっていると、このcondaコマンドの初期化を忘れてしまいますが、これらの設定は多くの場合シェルの「対話モード」でのみ有効になるように設計されています。

ゆえにシェルスクリプトのような非対話モードでは、condaコマンドが正しく機能してくれません

例えば、.bashrcファイル内のconda初期化部分には、以下のような条件が含まれています

# >>> conda initialize >>>
if [[ $- == *i* ]]; then  # 対話モードの場合のみ実行
    . "/path/to/anaconda3/etc/profile.d/conda.sh"
fi
# <<< conda initialize <<<

ここでの if [[ $- == *i* ]] が対話モードチェックであり、シェルスクリプトのような非対話環境では、この条件に合致せずconda初期化が行われません。
つまりシェルスクリプトの中でcondaコマンドがうまく動いてくれません。

解決策→enable_conda.shスクリプト

この問題を解決するために、以下のようなスクリプトを作成しましょう

#!/bin/bash
###[enable_conda.sh]###########################################################
# condaの初期化を明示的に行う
# ~/.bashrcの対話モードチェックをバイパスするために、条件部分を直接実行する

# ユーザーのホームディレクトリを使用
CONDA_PATH="$HOME/anaconda3"

# condaの初期化部分を直接実行
__conda_setup="$('$CONDA_PATH/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
    eval "$__conda_setup"
else
    if [ -f "$CONDA_PATH/etc/profile.d/conda.sh" ]; then
        . "$CONDA_PATH/etc/profile.d/conda.sh"
    else
        export PATH="$CONDA_PATH/bin:$PATH"
    fi
fi
unset __conda_setup

# パスを確認
echo "使用するcondaのパス: $(which conda)"
echo "condaのバージョン: $(conda --version)"
###[/enable_conda.sh]#########################################################

このスクリプトでは、

  1. 対話モードチェックをバイパスして、直接conda初期化コードを実行します
  2. 環境変数を適切に設定し、condaコマンドをシェルスクリプト中からも使用可能にします

sourceコマンドの重要性

さて、このスクリプトの効果を得るためには、これをsourceコマンドをつかって実行するのがポイントです

source ./enable_conda.sh
# または
. ./enable_conda.sh  # ドットコマンド(sourceと同等)

復習)sourceコマンドとは?

sourceコマンドは、指定されたファイル内のコマンドを現在のシェルプロセス内で直接実行するためのシェルビルトインコマンドです。これには以下のような特徴があります

  • ファイル内のコマンドが現在のシェルプロセス内で実行される
  • 環境変数の変更やエイリアスの定義など、シェルの状態変更が現在のセッションに反映される
  • .(ドット)コマンドと同じ機能を持つ

sourceと直接実行の違い

普段あまり気にしていませんが、スクリプトを直接実行する場合との違いは以下のようになります

実行方法 プロセス 環境変数への影響 Condaの場合
sh script.sh 新しいシェルプロセス(子プロセス)を作成 スクリプト内で設定された環境変数は終了後に失われる 初期化は子プロセスでのみ有効、親シェルではcondaコマンドは使えない
source script.sh 現在のシェルプロセス内で直接実行 環境変数の変更が現在のシェルに保持される 現在のシェルでconda初期化が行われ、以降condaコマンドが使える

Condaのような環境管理ツールを初期化するスクリプトでは、現在のシェル環境に変更を反映させる必要があるため、必ずsourceコマンドを使用しましょう

実践的な使用例

以下のように使用することができます

バッチ処理スクリプト

#!/bin/bash
# データ処理バッチジョブ

# condaを初期化
source /path/to/enable_conda.sh

# 特定の環境をアクティベート
conda activate myenv

# Pythonスクリプトを実行
python /path/to/process_data.py

# 処理完了後、基本環境に戻る
conda deactivate

定期実行(cron)ジョブ

crontabファイル:

# 毎日午前2時にデータ更新を実行
0 2 * * * /bin/bash /path/to/daily_update.sh

daily_update.sh:

#!/bin/bash
# conda初期化
source /home/user/scripts/enable_conda.sh

# 環境をアクティベート
conda activate analysis_env

# スクリプト実行
python /home/user/projects/update_database.py

# ログ出力
echo "$(date): データベース更新完了" >> /home/user/logs/cron.log

上記のようにスクリプトを別ファイルにしなくてもそんなにながくないので、実行していスクリプトに直接conda初期化コードを入れてしまってもOKですね

まとめ

シェルスクリプトからcondaコマンドを使用するには

  1. 対話モードチェックをバイパスする初期化スクリプト(enable_conda.sh)を作成する(またスクリプトに入れちゃってもOK)
  2. 外部スクリプトにする場合は、それをsourceコマンドで実行し、現在のシェル環境にconda設定をおぼえさせる
  3. 環境変数を活用して、異なる環境でも再利用可能にする

ということで、シェルスクリプトのなかで気軽にcondaが使えるようになりました!

Read more

「AIを作る国」から「AIで勝つ国」へ ── 日本のAI投資戦略を再設計する【後編】

「AIを作る国」から「AIで勝つ国」へ ── 日本のAI投資戦略を再設計する【後編】

── SaaS再編の時代に、どこにポジションを取るか こんにちは! Qualitegコンサルティングです! ここ数年、「日本のAI戦略」というテーマでの相談やディスカッションが増えてきました。 生成AIの登場以降、経営層から現場のエンジニアまで、それぞれの立場で「自社はどこに張ればいいのか」「国としてはどう進むべきか」を模索している、というのが実感です。 本シリーズでは、その問いに対して少し腰を据えて向き合ってみたいと思い、前後編の構成で書いてみました。 前編では、国産LLM、データセンター投資、データ主権の3テーマを通じて、日本のAI投資が必ずしも「使われて勝つ構造」に向かっていない可能性を見てきました。投資の総額やプレイヤーの動きを並べてみると、号令の方向と実際の資金の流れにはちょっとしたズレがあるのではないか、という現在地が見えてきます。 後編では、その前提の上で視点をソフトウェア産業全体に広げます。もしAIによってアプリケーション層そのものの競争ルールが変わるなら、日本が張るべき場所もまた変わるはずです。海外で起きているSaaS産業の地殻変動を眺めたうえで、日本がど

By Qualiteg コンサルティング
PyCharmで npm start 実行時にIDEがサイレントクラッシュした事例と切り分け

PyCharmで npm start 実行時にIDEがサイレントクラッシュした事例と切り分け

こんにちは!Qualitegプロダクト開発部です! PyCharmの内蔵npmツールで npm start を実行した瞬間、何のエラーメッセージもなくIDEが消える。 再起動してもう一度試すとまた落ちる。ログを見ても手がかりがない——。 今回はこの「サイレントクラッシュ」に遭遇し、原因の絞り込みから回避策の確立まで至った過程を書き残しておきます。同じ現象で困っている方の参考になれば幸いです。 環境 項目 内容 OS Windows 10/11 PyCharm 2026.1(2023.1.6時代から連綿とUpdateをした状態) Python 3.11.4(venv使用) Node.js v25.2.1 プロジェクト Python + Node.js 混合構成 上記のとおり、PyCharmは執筆時点の最新版(2026.1)となります。 確認できたこと・推測していること まず最初に、

By Qualiteg プロダクト開発部
大企業のAIセキュリティを支える基盤技術 - 今こそ理解するActive Directory 第6回 よくある問題と解決方法

大企業のAIセキュリティを支える基盤技術 - 今こそ理解するActive Directory 第6回 よくある問題と解決方法

こんにちは、今回はシリーズ第6回トラブルシューティング - よくある問題と解決方法 について解説いたします! さて、前回(第5回)は、統合Windows認証がブラウザでどのように動作するかを解説しました。 「イントラネットゾーン」という概念を理解することで、同じサーバーでもURLの書き方(NetBIOS名、FQDN、IPアドレス)によって認証動作が変わる理由が明確になったかと思います。また、Chrome/Firefoxではデフォルトで統合認証が無効になっている理由と、グループポリシーによる一括設定方法も学びました。 しかし、設定が完璧なはずなのに「なぜかうまく動かない」という場面は、実際の現場では必ず訪れます。 「最近、ファイルサーバーへのアクセスが遅い」「金曜日は使えたのに、月曜日の朝にログインできない」「特定のサービスだけKerberosが失敗する」——これらはヘルプデスクに日々寄せられる典型的な問い合わせです。 原因はKerberosの失敗、時刻のずれ、SPNの設定ミス、DNS関連の問題など多岐にわたりますが、体系的にトラブルシューティングすることで必ず解決できます。

By Qualiteg コンサルティング, Qualiteg AIセキュリティチーム
AIエージェントを"事業に載せる"ために【第2回】AIエージェントの責任分解はなぜ難しいのか

AIエージェントを"事業に載せる"ために【第2回】AIエージェントの責任分解はなぜ難しいのか

— AI導入を"事業に載せる"ために、いま設計すべきこと(全3回) こんにちは!Qualitegコンサルティングチームです! 前回(第1回)では、Replit/Lemkin事件とDeloitte豪州政府報告書問題を通じて、AIエージェント導入の課題がモデル性能ではなく「権限・監査・責任の設計不在」にあることを見ました。 では、実際に事故が起きたとき、責任は誰が負うのでしょうか。第2回となる本記事では、法務・契約・組織の3つの観点から、AIエージェントの責任分解がなぜ難しいのかを構造的に整理します。 結論を先に言えば、法務だけでも契約だけでも組織論だけでも足りません。この3つを接続して設計しなければ、AIエージェントの責任分解は実務上機能しません。 1. 法的フレームワーク:複数の法理論が並走している AIエージェントが損害を出したとき、どの法理論で責任が問われるかについて、現時点でグローバルなコンセンサスは形成されていません。 Clifford Chanceの論考は、この状況の根本的な難しさを整理しています。法律は歴史的に、有害な行為がいつどのように発生したかを特定でき

By Qualiteg コンサルティング