AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 672123
Accepted
kjo
kjo
Asked: 2021-10-07 06:44:01 +0800 CST2021-10-07 06:44:01 +0800 CST 2021-10-07 06:44:01 +0800 CST

Como um script de shell pode saber que foi invocado na CLI do shell?

  • 772

Eu gostaria de implementar um zshscript que se comporte de maneira diferente dependendo se foi invocado diretamente na CLI do shell ou não.

A princípio pensei que o script poderia fazer isso procurando ino valor de $-, mas me enganei.

Na verdade, quando executo o script abaixo na linha de comando

#!/bin/zsh
printf -- '%s\n' "$-"

...a saída que recebo não inclui i1 .

Existe alguma outra maneira para o meu script de shell descobrir essas informações?

NB: Embora eu esteja trabalhando em um zshroteiro no momento, eu também gostaria de saber qual seria a resposta para um bashroteiro. Se a resposta depende do OS, estou interessado principalmente em Linux e Darwin.


1 A saída do script é 569X, se alguém quiser saber.

bash zsh
  • 1 1 respostas
  • 201 Views

1 respostas

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2021-10-07T22:19:10+08:002021-10-07T22:19:10+08:00

    $-contém iquando o próprio shell é um shell interativo, quando emite prompts, permite inserir e editar linhas de comando no terminal, faz controle de trabalho etc.

    Um script normalmente é interpretado por um shell não interativo. Se você chamar o script como ./the-scriptou zsh ./the-script, essa zshinstância não será interativa. A única vez que seu script será interpretado por um shell interativo é quando você diz ao seu shell interativo para interpretar o código nele com coisas como source ./the-scriptou eval "$(<the-script)".

    Aqui, parece-me que você quer saber se o script é invocado de dentro de um terminal, como você deseja saber se um usuário pode interagir com ele por meio de um terminal.

    Que o comando [/ test(que está embutido no zsh e bash e na maioria dos outros shells do tipo Bourne, mas também deve existir como um comando autônomo em sistemas POSIX) pode informar com seu -toperador. Esse -toperador recebe um¹ argumento numérico que é um descritor de arquivo.

    [ -t 0 ]ou test -t 0retorna true se o descritor de arquivo 0 estiver aberto em um dispositivo terminal. Descritor de arquivo 0 é entrada padrão , 1 é saída padrão , 2 é erro padrão , todos os outros fds não têm nenhum significado especial reservado.

    Então, no seu script, você pode fazer:

    if [ -t 0 ]; then
      echo "I (this script) am taking input from a terminal, so likely from a user"
    fi
    
    if [ -t 1 ]; then
      echo "My output goes to a terminal device, so will likely be seen by a user"
      [ -t 2 ] && echo errors also go there.
    fi
    

    Se você quiser verificar se o script é executado de dentro de uma sessão de terminal, mesmo que sua entrada e/ou saída possa ser redirecionada para algum outro arquivo que não o dispositivo de terminal, você pode verificar se há um terminal conectado à sessão do script com algo como :

    if { true <> /dev/tty; } 2> /dev/null; then
      echo "there's a terminal device attached to my session"
    fi
    

    Se você quiser saber qual é o dispositivo terminal:

    tty_on_stdin=$(tty)
    
    tty_on_stderr=$(tty <&2)
    
    { tty_on_stdout=$(tty <&3); } 3>&1
    

    (veja este Q&A de acompanhamento para a razão por trás dessa dancinha com fd 3).

    controlling_tty=$(LC_ALL=C ps -o tty= -p "$$")
    [ "$controlling_tty" = '?' ] || controlling_tty=/dev/$controlling_tty
    

    ¹ Em implementações test/ anteriores [, esse argumento era opcional e [ -t ]era abreviação de [ -t 1 ]. Isso não é mais permitido pelo POSIX, pois entra em conflito com o [ "$var" ]caso de uso que é abreviado para [ -n "$var" ]. Ainda assim, você descobrirá que ksh93ainda verifica se stdout vai para um tty com [ -t ]though somente quando -té literal; var=-t; [ "$var" ]retorna true mesmo se stdout não estiver em um terminal.

    • 5

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve