私はPythonを得ました。シェルスクリプトを取得できませんでした。シェルスクリプトを学ぶことができますが、代わりにPythonを使用できる場合は、そうしたくありません。
私にとって良い出発点はスクリプトです.profile
。現在私には次のようになります。
# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.
# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022
# if running bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
# added by Anaconda2 2.4.0 installer
export PATH="/home/alien/anaconda2/bin:$PATH"
# ===== Added manually.
# texlive
export PATH="/home/alien/texlive/2015/bin/x86_64-linux:$PATH"
export INFOPATH="/home/alien/texlive/2015/texmf-dist/doc/info:$INFOPATH"
export MANPATH="/home/alien/texlive/2015/texmf-dist/doc/man:$MANPATH"
# petsc
export PETSC_DIR="/home/alien/petsc"
# PYTHONPATH
export PYTHONPATH="/home/alien/cncell:$PYTHONPATH"
export PYTHONPATH="/home/alien/csound:$PYTHONPATH"
代わりに、次のような文章を書きたいです。
import os
import subprocess
# if running bash
HOME = os.environ["HOME"]
if os.environ["BASH_VERSION"]: #not sure how to complete this line
bashrc_path = os.path.join(HOME, ".bashrc")
if os.isfile(bashrc_path):
subprocess.call([bashrc_path])
user_bin_dir = os.path.join(HOME, "bin")
if os.isdir(user_bin_dir):
os.environ["PATH"] += ":" + user_bin_dir
user_added_vars = [("PATH", "/home/alien/anaconda2/bin"),\
("PATH", "/home/alien/texlive/2015/bin/x86_64-linux"),\
("INFOPATH", "/home/alien/texlive/2015/texmf-dist/doc/info"),\
("MANPATH", "/home/alien/texlive/2015/texmf-dist/doc/man")]
for var_name, addition in user_added_vars:
os.environ[var_name] += ":" + addition
これは私にとってもっと読みやすく、おなじみです。
bashスクリプトを必要とするPythonスクリプトを何とか書くことはできますか?以前の質問への回答が役に立つと思いました。#!/usr/bin/env python
たぶん、スクリプトの上に「Python Script」と指定する必要がありますか?しかし、#!/bin/bash
現在の一番上に行がないのはなぜですか.profile
?
答え1
まさか。.profile
(および.bashrc
).bash_logout
は.bash_profile
シェルによって異なります。つまり、シェルプログラムとシェルプログラムだけがこれらのファイルを読み込みます。それ(シェル)はこれらを別々のプロセスとして実行しませんが、源泉彼らのアプローチはPythonのアプローチと似ています。輸入だが、優雅さとは距離が遠い。同様のことが必要な場合は、Pythonベースのシェルを見つける必要があります。この関連質問に対する回答が見つかりました。ここ。
最も手に入るのは、操作を実行してからシェル互換のペアをKEY=VALUE
エクスポートし、それを標準出力として印刷してから、次の.profile
ようなものを含むPythonスクリプトです。
set -a
eval `python $HOME/.profile.py`
set +a
しかし、知っておくべきことがいくつかあります。まず、VALUE
これらすべてを正しく参照する必要があります。通常、VALUEに一重引用符が含まれていない場合は、一重引用符が必要です。第二に、一部のシェル変数はオーバーライドしてはいけません(何をしているのかわからない限り)。最初に浮かぶ変数はSECONDS、RANDOMです。
注:このset
機能は自動エクスポート機能のオンとオフを切り替えるため、Pythonからシェルに送信されるすべての変数はシェルからサブプロセスにエクスポートされます。 Pythonスクリプトの各KEYの前に用語がある場合は、これを行う必要はありませんexport
。 (しかし、これは元のBourneシェルと厳密に互換性がありません。)