.profile 是用 shell 脚本编写的——我可以让我的系统明白我希望它执行 Python 脚本吗?

.profile 是用 shell 脚本编写的——我可以让我的系统明白我希望它执行 Python 脚本吗?

我得到了Python。我没有得到 shell 脚本。我可以学习 shell 脚本,但如果我可以使用 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 脚本”?但是,为什么#!/bin/bash当前的顶部没有一行呢.profile

答案1

并不真地。 and .profile( .bashrcand.bash_logout.bash_profile) 特定于 shell。也就是说,shell 程序并且只有shell 程序读取这些文件。它(shell)不会将这些作为单独的进程执行,而是来源它们的方式类似于 Python 的方式进口,但远没有那么优雅。如果你想要类似的东西,你需要找到一个基于 python 的 shell。找到了该相关问题的答案这里

你能得到的最接近的是一个Python脚本,它完成它的工作,然后导出它的shell兼容KEY=VALUE对,将它们打印到标准输出,然后在.profile或其他什么中,你有(例如):

set -a
eval `python $HOME/.profile.py`
set +a

但是,您必须注意几件事。首先,所有这些VALUE都必须被适当地引用。通常,您需要单引号,除非 VALUE 包含单引号。其次,某些 shell 变量不应被覆盖(除非您知道自己在做什么):首先想到的是 SECONDS,RANDOM。

顺便说一句:这set对打开和关闭自动导出,以便您从 python 发送到 shell 的任何变量,然后由 shell 导出到子进程。如果您的 python 脚本在每个 KEY 前面带有术语 ,则不需要这样做export。 (但是,严格来说,这与原始的 Bourne shell 不兼容。)

相关内容