我得到了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
( .bashrc
and.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 不兼容。)