Tengo un script de Bash que intentaba hacer para ayudarme a ejecutar un comando bastante complejo con pequeños cambios que me preguntaría a través de echo y read.
He encontrado soluciones para forzarlo a ejecutar un terminal para ejecutar el comando, pero no estoy interesado en eso. Lo que me gustaría que hiciera es que, si dejo espacio y presiono Enter en Nautilus (haciendo que se ejecute con Run Software), aparecerá una notificación que dice "Por favor, ejecute esto desde un terminal".
Puedo hacer que aparezca la ventana emergente, ya que conozco el comando, pero no puedo hacer que el script Bash diga si se está ejecutando dentro de una terminal o no, parece que siempre lo creo. ¿Es posible?
||
dentro de[ … ]
esa manera? Si lo usa[[ … ]]
, estaría bien, pero normalmente||
se usa para separar comandos y[ -t 0
es una invocación incorrecta de[
porque]
falta el último . Por lo general, tampoco hay un comando-p
. Estoy de acuerdo con las pruebas para un terminal; esa es probablemente la forma de hacerlo. Es solo la sintaxis lo que me preocupa.||
se ve antes del]
argumento final requerido para[
.PS1
No es una prueba confiable para saber si el shell es interactivo. "Si un script necesita probar si se está ejecutando en un shell interactivo" también es confuso: debería ser si algún código necesita probar, un script generalmente no se está ejecutando en un shell interactivo (pero puede serlo, si se obtiene) . La prueba dei
in$-
es la forma correcta de probar si el shell es interactivo. Probar-t 0
o-t 2
es la forma correcta de saber si el script se está ejecutando en una terminal, lo que es diferente de ser interactivo.Use la variable bash $ SHLVL para detectar el nivel de anidación de shell. En una secuencia de comandos ejecutada 'raw' haciendo doble clic, será 1, en una secuencia de comandos que se ejecuta dentro de un terminal será 2.
fuente
Aunque la respuesta de Ricitos de Oro es probablemente correcta en el caso típico, parece que hay casos extremos. En mi propio caso, mi servidor x está configurado para iniciarse
tty1
y nunca sale de ese tty. Si Xorg'sstdout
es un TTY, entonces parece que los clientes tendrán ese TTY vinculado a su descriptor de archivo de forma predeterminada.Así es como resolví mi problema:
No he probado esto para ver si funciona en una configuración X más estándar, y también dudo mucho de que este sea el único caso límite. Si alguien encuentra una solución más generalmente aplicable, regrese y díganos.
fuente
Otra, mediante las opciones de bash establecidos variable interna,
$-
.De
.bashrc
,fuente
cmd | sh -i | cmd
.