.zshrcで定義されたエイリアスはシェルスクリプトに伝播されません。

.zshrcで定義されたエイリアスはシェルスクリプトに伝播されません。

私のシステムにPythonがインストールされていますpython3。私の.zshrcファイルに次のエイリアスを定義しました。

alias python=python3

これにより、コマンドラインから実行できますpython3python

$ python
Python 3.11.6 (main, Nov  2 2023, 04:39:43) [Clang 14.0.3 (clang-1403.0.22.14.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 

しかし、次のようなシェルスクリプトを書くとtest.sh

#!/bin/bash
python

次に、次のようにこのスクリプトを実行します。

$ ./test.sh

私は得る:

./test.sh: line 2: python: command not found

どうなりますか?どうすれば解決できますか?明らかに、これはMacではありますが、結果はLinuxでも同じでなければならないと思います。ありがとうございます。

答え1

エイリアスと関数はシェルスクリプトに伝播されません。これは意図的に設計されています。これにより、標準コマンド名の非標準動作を定義できます。これをスクリプトに提供すると、スクリプトが中断される可能性があります。これは、コマンドにデフォルトオプションを追加するためによく使用されるエイリアスの場合に特に当てはまります。

スクリプトに別の名前のコマンドが必要な場合に実行します$PATH。スクリプトに非標準バージョンのコマンドが必要な場合は、専用ディレクトリを使用してスクリプトを実行します。たとえば、python明示的に呼び出されるスクリプトや#!/usr/bin/env pythonshebang行を含むスクリプトがあり、他のバージョンのPythonを呼び出す場合:

  1. 次のディレクトリを作成します。mkdir ~/myscript-bin
  2. そのディレクトリに目的のバージョンをリンクします。ln -s /usr/bin/python4.2 ~/myscript-bin/python
  3. スクリプトを実行するときは、コマンド検索パスにこのディレクトリを最初に入力してください。PATH=~/myscript-bin:$PATH myscript

Pythonの場合、複数のバージョンを保持するのに役立つツール、特にライブラリの管理に役立つツールがたくさんあります。スクリプトにデフォルト以外のPythonバージョンまたはデフォルト以外のPythonライブラリセットが必要な場合仮想環境それのために。

python4.2 -m venv ~/myscript-env
# If the script needs extra packages:
(. ~/myscript-env/activate && pip install package1 package2)
(. ~/myscript-env/activate && myscript)

答え2

Edが説明したように、zshとbashは2つの異なる環境です。 Appleはデフォルトのシェルをzshに変更し、まだbashでシェルスクリプトを作成するので、エイリアスを.aliasファイルに入れてから、.zshrcと.bashrcの両方をソーシングします。私は私の機能についても同じことをしました。

関連情報