Infelizmente, o design dos emuladores de terminal (como a janela do terminal na sua caixa do Ubuntu) não permite um bom suporte à colagem; em particular, na maioria das vezes, colar funciona exatamente como digitar a mesma coisa (se você fosse um digitador rápido muito). A maioria das coisas que você acha que é um sinal especial para o programa em execução no terminal é, na verdade, dados em banda - isto é, apenas um caractere. Se a sua pasta contiver esse caractere, o programa não poderá dizer a diferença entre você digitar o caractere e colá-lo.
Assim, você não pode realmente usar colar para transferir arquivos, a menos que não contenham caracteres que possam confundir o programa de recebimento. Em particular, as guias que sua pasta contém são confusas - ele está vendo uma tabulação e tentando executar o arquivo ou o comando. Assim como quando você digita uma guia.
O truque cat > filename
pode falhar se houver um controle D (sim, esse é um caractere) no conteúdo colado. Mas se você evitar caracteres de controle (além de nova linha e tabulação), isso deve funcionar.
As pessoas do Unix normalmente usam programas de transferência de arquivos para mover arquivos. O básico que usamos principalmente é scp
ou sftp
, ambos fazem parte do SSH (e, portanto, são totalmente criptografados, autenticados, etc. - as mesmas garantias de segurança que o SSH fornece).
A maneira mais fácil de trabalhar entre o Windows e uma VM do Ubuntu (ou vice-versa) é provavelmente usar os recursos de compartilhamento de arquivos do seu hipervisor (produto do VM) - a maioria deles. Você pode escolher um diretório no host e ele ficará visível dentro do convidado. Com o WSL, você pode acessar todos os seus arquivos do Windows em /mnt/<drive letter>/
. Se o seu hipervisor não tiver esse recurso, o segundo mais fácil é usar um compartilhamento de arquivo comum. Você pode montar compartilhamentos de arquivos do Windows a partir do Ubuntu ou instalar o Samba no Ubuntu para fazer compartilhamentos de arquivos para o Windows.
Dependendo do que você está fazendo, pode haver melhores abordagens. Por exemplo, implantação automatizada. Talvez você queira tê-lo algum que você verifique o arquivo para git, e então ele é automaticamente implantado na sua caixa Ubuntu quando você faz um git push
? Isso pode ser tão simples quanto usar git hooks, ou muito mais complicado - existem pacotes inteiros de software dedicados a ele.
Finalmente, há uma grande vantagem em escrever esses scripts em arquivos, não apenas colá-los em um shell: o arquivo serve como documentação do que você fez. Algo deu errado? A menos que seja realmente errado, verifique o arquivo para ver o motivo. Isso permite determinar exatamente o que deu errado, geralmente o primeiro passo para reparar o dano. Precisa fazer de novo? Apenas forneça o arquivo pela segunda vez. Precisa fazer algo parecido? Edite o arquivo e, em seguida, digite-o.
Se você precisar colar um aqui-doc:
Se você quiser colar diretamente no bash, a melhor opção é garantir que ele não contenha caracteres de controle que não sejam newline. Colando isso deve funcionar:
bash /dev/fd/10 10<<'SES'
cat <<EMR >> /etc/apache2/apache2.conf
#
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
EMR
SES
Se você precisa ter o recuo, pode usar espaços e sed ao invés do primeiro -
para removê-lo (observe aqui que foi em frente e usou stdin em vez de fd 10 porque a sintaxe é mais fácil e duvido que seja importante) :
sed -e 's/^\s\+//' <<'SES' | bash
cat <<EMR >> /etc/apache2/apache2.conf
#
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
EMR
SES
Que usa a funcionalidade de substituição de pesquisa do sed ( s/PATTERN/REPLACEMENT/
) para olhar o início da linha ( ^
) para espaço em branco ( \s
) repetido uma ou mais vezes ( \+
) e substitui por nada . Em outras palavras, corta todos os espaços principais em cada linha. A opção -e
para sed identifica explicitamente que isto é um script sed para ser executado - não é realmente necessário, sed irá interpretar seu primeiro argumento como script de qualquer maneira - mas eu pessoalmente acho mais claro usar sempre -e
.
Observe que "espaço em branco" acima inclui espaços e tabulações (e mais alguns caracteres que não são realmente relevantes aqui). Esse sed irá cortar todos eles, independentemente da mixagem usada.
Claro, eu não tenho idéia do porque você está colando um comando no bash dizendo para ele executar o bash para rodar o cat.