Quiero ejecutar un programa en un entorno vacío (es decir, sin conjuntos de variables). ¿Cómo hacer esto en bash?
Quiero ejecutar un programa en un entorno vacío (es decir, sin conjuntos de variables). ¿Cómo hacer esto en bash?
Respuestas:
Puedes hacer esto con env
:
env -i your_command
Contrariamente a los comentarios de abajo, esto lo hace completamente claro el medio ambiente, pero no impide your_command
el establecimiento de nuevas variables. En particular, ejecutar un shell hará /etc/profile
que se ejecute, y el shell también puede tener algunas configuraciones integradas.
Puede verificar esto con:
env -i env
es decir, limpie el entorno y luego imprímalo. La salida estará en blanco.
echo 'echo $PATH' > test.sh && chmod u+x test.sh && env -i test.sh
impresiones /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
.
PATH
, PWD
y SHLVL
se ajustan automáticamente por Bash. +1.
env -i bash --norc -c "declare -p PATH"
da declare -- PATH="/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."
. Tenga en cuenta el "-x" para exportado (y, por lo tanto, parte del entorno) si lo exporta usted mismo: env -i bash --norc -c "export PATH; declare -p PATH"
dadeclare -x PATH="/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."
Se bash
puede tener un ambiente "limpio" con
$ env -i bash --noprofile --norc
El env -i
comando ejecuta el comando que se le da en la línea de comando sin transferir ninguna de las variables de entorno exportadas del antiguo entorno de shell al entorno del programa ejecutado.
La --noprofile
opción deja bash
de leer los scripts de inicialización del shell personal o de todo el sistema que de otro modo se leerían para un shell de inicio de sesión.
La --norc
opción deja bash
de leer los scripts de inicialización de shell personal que de otro modo se leerían para un shell interactivo.
env -i
? ¿En qué sistema estás?
env
para limpiar mi entorno, y --noprofile
evitar el abastecimiento / etc / profile and friends, y --norc
evitar el abastecimiento ~ / .bashrc y amigos.
env -i somecommand
ejecuta un comando en un entorno vacío, como ya ha mencionado ams .
Muchos programas dependen de algunas variables de entorno importantes, por lo que es posible que desee conservarlas:
env -i HOME="$HOME" LC_CTYPE="${LC_ALL:-${LC_CTYPE:-$LANG}}" PATH="$PATH" USER="$USER" somecommand
Alternativamente, puede iniciar sesión en un pequeño entorno de tiempo de inicio de sesión.
ssh localhost somecommand
env
no admite la --
delimitación y hace env -i FOO=bar -- env
intentos de ejecutar un comando llamado --
.
env -i -- FOO=bar env
, en realidad. Culpa mía. No es que --
sea útil ya que lo que sigue no comienza con -
.
Si bien la respuesta aceptada es correcta, lo que generalmente desea hacer es:
env -i bash -l -c "printenv; and any other commands"
Esto le proporciona un bash básico pero funcional (igual que obtendría al iniciar sesión en modo no interactivo). Esto, por ejemplo, establece el idioma, la zona horaria, el INICIO, etc.
env -i
borra HOME
, lo que significa bash -l
que no puede encontrar su .bash_profile
etc. Si desea un shell que es como lo que obtendría con un inicio de sesión nuevo, necesita una indirección adicional para configurar HOME
primero.
El problema con la mayoría de las respuestas aquí es que env -i
desaparece HOME
, por lo que incluso si se ejecuta bash -l
en el interior, no leerá su .bash_profile
etc. Si lo que está buscando es un shell que actúa como si acabara de hacer un nuevo inicio de sesión, usted Quisiera esto en su lugar:
env -i HOME="$HOME" bash -l -c 'your_command'
Ejemplo:
$ export ABC=123
$ env -i HOME="$HOME" bash -l -c 'env' | grep ABC
$ env HOME="$HOME" bash -l -c 'env' | grep ABC
ABC=123
bash
se ejecutará un shell de inicio de sesión .bash_login
o .bash_profile
. Para obtener un entorno limpio, use --noprofile
o establezca HOME
un directorio que no tenga esos archivos. Supongo que depende de lo que quieras decir con "limpio".
env -i bash -c ...
. Esta respuesta es específicamente cuando desea un shell que parece que acaba de hacer un nuevo inicio de sesión en la máquina.
Para responder el comentario de balki (y responder mi propia pregunta en el proceso :-):
% echo Environment in calling shell: vars: $(env |wc -l); echo; ./du; echo; cat du
Environment in calling shell: vars: 43
==> This is the environment: vars: 5
PATH="$PATH"
PWD=/Users/nick
SHLVL=1
SOMETHING_TO_KEEP="$USER"
_=/usr/bin/env
==> The end.
#!/usr/bin/env -i SOMETHING_TO_KEEP="$USER" PATH="$PATH" /bin/sh
echo "==> This is the environment: vars:" $(/usr/bin/env | /usr/bin/wc -l)
/usr/bin/env
echo "==> The end."
/usr/bin/env: invalid option -- ' ' Try '/usr/bin/env --help' for more information.
--ignore-environment
, obtengo esto:/usr/bin/env: unrecognized option '--ignore-environment SOMETHING_TO_KEEP="$USER" PATH="$PATH" /bin/sh' Try '/usr/bin/env --help' for more information.