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 / 723082
Accepted
ChennyStar
ChennyStar
Asked: 2022-11-01 00:03:10 +0800 CST2022-11-01 00:03:10 +0800 CST 2022-11-01 00:03:10 +0800 CST

O espaço não é usado como separador de argumentos pelo script de shell (alguém poderia explicar essa pequena diferença de arquivo?)

  • 772

VERSÃO CURTA (TL;DR)

Eu tenho 2 pequenos arquivos de uma linha, aparentemente idênticos:

$ cat f1 f2
./cconv.sh 100 EUR USD
./cconv.sh 100 EUR USD

Mas eles não são, há uma diferença de 1 byte no tamanho:

$ ls -l f1 f2
(...) 24 oct.  30 16:19 f1
(...) 23 oct.  30 16:19 f2

$ diff f1 f2
1c1
< ./cconv.sh 100 EUR USD
---
> ./cconv.sh 100 EUR USD

Eu costumava dhexdescobrir a diferença hexadecimal. Parece que :

  • f1termina comc2 a0 55 53 44 0a
  • f2termina com 20 55 53 44 0a

Alguém tem ideia do que está acontecendo aqui? Qual é a diferença e, mais importante, de onde poderia vir? Aqui está um link para um arquivo zip contendo os 2 arquivos e uma captura de tela do dhexresultado.

VERSÃO LONGA (EXPLICAÇÕES ADICIONAIS)

Os 2 arquivos são trechos do meu arquivo ~/.bash_history file.

Percebi um comportamento muito estranho das minhas conchas. Pegue o seguinte script muito básico:

#!/bin/sh
echo $#
echo "$1"
echo "$2"
echo "$3"
exit 0

Sob certas circunstâncias (mas quais ???), ele não usa o espaço como separador de argumentos:

$ ./cconv.sh 100 EUR USD
2
100
EUR USD

Mas às vezes funciona exatamente como deveria:

$ ./cconv.sh 100 EUR USD
3
100
EUR
USD

Isso me deixa louco! Passei várias horas tentando descobrir o que estava acontecendo. Aqui estão alguns testes que fiz para tentar reduzi-lo:

  • Eu trabalho em um laptop com Debian 11, Gnome 3.38. Mas acontece que também tenho uma máquina virtual com exatamente o mesmo sistema operacional (D11, G3.38), e na VM tudo funciona bem. Então, obviamente, devo ter feito algo no meu laptop bare metal para que ele se comportasse mal. Mas o que ???
  • Percebi que o problema ocorre apenas em uma sessão gráfica. Se eu abrir um tty (Ctrl+Alt+F n ), funciona bem
  • Suspeitei do meu emulador de terminal. Mas o comportamento é o mesmo em emuladores diferentes (tentei Gnome Terminal, Terminator e Konsole, mesmo resultado)
  • Suspeitei da concha. Mas o comportamento é o mesmo com Bash ou Dash
  • Desativei todas as personalizações que pude pensar:
    • Eu removi temporariamente /etc/bashrc, /etc/profilee/etc/inputrc/etc/rc.local
    • Eu removi temporariamente ~/.bashrce~/.profile~/.inputrc
    • Desativei todas as extensões do Gnome Shell
  • Eu até suspeitei do teclado e conectei um teclado USB. Mesmo resultado.

Estou realmente confuso, e não tenho a menor idéia do que está acontecendo. Eu finalmente notei essa pequena diferença entre os 2 comandos em ~/.bash_history: um vem da minha sessão do Gnome, o outro vem da minha sessão tty. Obviamente, há uma diferença, mas o que é exatamente e qual poderia ser a causa?

shell-script
  • 1 1 respostas
  • 807 Views

1 respostas

  • Voted
  1. Best Answer
    ilkkachu
    2022-11-01T01:03:50+08:002022-11-01T01:03:50+08:00

    c2 a0é a codificação UTF-8 do caractere de espaço ininterrupto . Geralmente parece um espaço regular, mas não é reconhecido como espaço em branco pelo shell.

    Em alguns mapas de teclas, algo como AltGr+ Spaceou Option+ Spaceproduz um espaço sem quebra. O que é divertido se o seu mapa de teclado também tiver, por exemplo, o caractere pipe atrás de AltGrou Option, facilitando a digitação |<nbsp>em vez de |<sp>, dando a você erros como este:

    $ echo foo | grep .
    bash:  grep: command not found
    

    (Acho que SE dobra o nbsp para um espaço regular, então você provavelmente não receberá o erro se copiar isso daqui.)

    Se você copiou e colou os argumentos de alguma outra ferramenta, pode obter uma formatação estranha a partir daí, mas depende do programa.

    Consulte Lidar com o caractere nbsp no shell para algumas soluções para não produzir o caractere.

    • 20

relate perguntas

  • Subtraindo a mesma coluna entre duas linhas no awk

  • Um script que imprime as linhas de um arquivo com seu comprimento [fechado]

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

  • Dividir por delimitador e concatenar problema de string

  • MySQL Select com função IN () com array bash

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