.profile é escrito em shell script - posso fazer meu sistema entender que quero executar um script Python?

2

Eu recebo Python. Eu não recebo script de shell. Eu poderia aprender shell script, mas eu preferiria não se eu pudesse usar o Python em seu lugar.

Um bom lugar para eu começar seria o script .profile . Atualmente, para mim é:

# ~/.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"

Em vez disso, gostaria de escrever algo assim:

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

Isso é mais legível / familiar para mim.

É possível, de alguma forma, escrever scripts em Python, onde scripts bash são esperados? Acho que uma resposta a uma pergunta anterior pode ser útil , talvez apenas coloquemos #!/usr/bin/env python no topo do script para designá-lo como "script Python"? Mas então, por que não há uma linha #!/bin/bash no topo do atual .profile ?

    
por user89 10.12.2015 / 06:17

1 resposta

1

Não realmente. Os .profile e .bashrc (e .bash_logout e .bash_profile ) são específicos para o shell. Ou seja, os programas shell e somente os programas shell lêem esses arquivos. Ele (o shell) não os executa como um processo separado, mas sim source , de uma maneira similar a como o Python faz uma importação , mas muito menos elegante. Se você quiser algo semelhante, você precisa encontrar um shell baseado em Python. Uma resposta a essa pergunta relacionada foi encontrada aqui .

O mais próximo que você pode obter é um script python que faz seu trabalho e, em seguida, exporta seus pares KEY=VALUE compatíveis com o shell, imprime-os no padrão e, em .profile ou o que for, você tem (por exemplo) :

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

Você deve, no entanto, cuidar de várias coisas. Primeiro, todos esses VALUE s devem ser adequadamente citados. Normalmente, você deseja aspas simples, a menos que o VALUE contenha aspas simples. Segundo, certas variáveis de shell não devem ser sobrescritas (a menos que você saiba o que está fazendo): SECONDS, RANDOM vêm à mente.

A propósito: O par set liga e desliga a exportação automática, de modo que quaisquer variáveis que você enviar do python para o shell, serão exportadas pelo shell para subprocessos. Isso não é necessário se o seu script python preceder cada KEY com o termo export . (No entanto, estritamente falando, isso é incompatível com o shell Bourne original.)

    
por 10.12.2015 / 10:33