Como posso proteger os parênteses passados ​​para um comando cd?

Como posso proteger os parênteses passados ​​para um comando cd?

Pergunteiaquicomo proteger cdespaços. O preenchimento de guias é ótimo, mas às vezes você cola o caminho da área de transferência, então isso é útil.

A solução, entretanto, quebra entre parênteses. Não importa como você tente escapar e proteger a entrada, ela sempre retorna:

bash: syntax error near unexpected token `('

Existe alguma maneira de lidar também com parênteses? O que eu quero é que quando eu entrar nisso, funcione:

cd My path with spaces (and parentheses)

Responder1

Use aspas simples 'ao redor do argumento. (Isso funciona para qualquer comando, não apenas cd).

cd 'My path with spaces (and parentheses)'

Você não pode fazer o bash passar os parênteses para cd. Fazer com que os espaços funcionem é um hack muito especializado.

As aspas simples funcionam em torno de todos os caracteres, exceto 'ele mesmo. Substitua aspas simples pela sequência de 4 caracteres '\''.

cd 'Apostrophe'\''s a pain'

Isso não funciona se o nome do diretório começar com um hífen, porque isso faz com que o cdcomando interprete o argumento como uma opção. Passe --antes do nome do diretório para evitar isso.

Verhttps://unix.stackexchange.com/questions/69144/how-do-i-escape-a-sub-directory-name-with-an-ampersand-in-it/69147#69147para mais detalhes.

Outro método é fazer com que o shell leia uma linha separada de texto em vez de passar o argumento na linha de comando.

Strapakowsky@darkstar ~$ read -r; cd -- "$REPLY"
My path with spaces (and parentheses)
Strapakowsky@darkstar ~/My path with spaces (and parentheses)$ 

Em vez de copiar e colar manualmente, você também pode fazer isso de forma programática. Instalexclipouxsel.

cd -- "$(xclip -o -selection clipboard)"
cd -- "$(xsel -bo)"

Você pode fazer disso um apelido.

alias cde='cd -- "$(xsel -bo)"'

Responder2

Como cdacessar corretamente diretórios com caracteres como espaços e parênteses em seus nomes:

Se o nome da sua pasta não incluir aspas simples ', basta colocá-lo entre aspas simples:

cd 'My path with spaces (and parentheses)'

Se incluir um ', mas não incluir um caractere de aspas duplas ", uma folga \, uma crase `ou um dólar $, coloque-o entre aspas duplas:

cd "My path with spaces (and parentheses)"

Não é muito comum que um nome de arquivo ou diretório contenha aspas simples e duplas. (Talvez isso se deva ao fato de não ser comum que um nome de arquivo ou diretório contenha aspas duplas. A única razão pela qual não recomendei aspas duplas originalmente é que, diferentemente das aspas simples, as aspas duplas permitem $expandir variáveis ​​de ambiente. Isso seria um problema se o nome do arquivo contivesse um $caractere seguido de texto.)

Se contiver ambos, ou se você quiser apenas outro método, poderá escapar manualmente de cada espaço e parênteses inserindo uma barra invertida \antes dele:

cd My\ path\ with\ spaces\ \(and parentheses\)

Isso é chato, mas felizmente, o shell comfaça isso por você, se você digitar o início do nome e pressionar Tab. Se houver mais de um nome de arquivo ou diretório que comece com My, talvez seja necessário digitar mais alguns para expandi-lo. Se você pressionar Tabe ele não expandir, você poderá pressionar Tabnovamente para ver uma lista de arquivos que correspondem ao que você digitou até agora. Então você sabe quanto mais precisa digitar para que corresponda de maneira exclusiva e se expanda.

Alternativamente, você pode escapar das aspas internas. Por exemplo, suponha que você tenha uma pasta chamada:

Mischa's gardening tips for "home and office"

Você pode usar:

cd Mischa\'s\ gardening\ tips\ for\ \"home\ and\ office\"

Mas você também pode simplesmente usar:

cd 'Mischa'\''s gardening tips for "home and office"'

As barras invertidas não são especiais entre aspas simples, então encerramos a string entre aspas simples, acrescentamos uma aspa simples protegida por barra invertida e iniciamos imediatamente outra string entre aspas simples, tudo sem qualquer espaço que iniciaria um argumento separado.

Por que você provavelmente não consegue fazer cdo trabalho do jeito que queria:

Quanto a começar cd My path with spaces (and parentheses)a trabalhar: não, você realmente não pode fazer isso, porque esse comportamento não é específico do cdcomando, faz parte do funcionamento de qualquer comando. Quando um comando é executado, ele fornece uma lista de argumentos fornecidos pelo usuário. Quando o shell vê um espaço, ele sabe que um argumento acabou de terminar e outro começou. Para passar um espaço como parte de um argumento, ele deve ser citado de uma das maneiras acima.

Você poderia conseguirpapeldistoalgunsdo tempo - você pode cd My path with spacestrabalhar para entrar na My path with spacespasta. Você poderia conseguir isso escrevendo um script de shell que concatena todos os argumentos fornecidos pelo usuário com espaços. (Então, se você quiser, poderá cdchamar esse script, criando um alias de shell com o nome cddele; isso teria precedência sobre o shell integrado cdque você está executando normalmente.) Mas:

  • O script não receberia argumentos diferentes para My path with spacese My path with spaces, portanto cd My path with spacesfalharia ou entraria na pasta errada.

  • Você não poderia fazer isso com os parênteses, porque eles são usados ​​para agrupamento pelo shell de forma que não sejam comunicados de forma alguma a um comando. Na verdade, na maioria das vezes o shell simplesmente gera um erro de sintaxe (como você viu):

    ek@Kip:~$ cd My path with spaces (and parentheses)
    bash: syntax error near unexpected token `('
    

    Não importa o que você altere, esse erro de sintaxe continuará a ocorrer quando o comando for fornecido.

Eu digo que você "provavelmente" não pode fazer isso funcionar porque existe uma maneira de fazer isso - você pode criar seu próprio shell que se comporte como desejar. Mas isto é extremamente difícil e é improvável que alguém queira fazer isso, apenas para fazer esta mudança. (Você também pode modificar o código-fonte de um shell existente, que é uma solução mais prática, mas ainda requer mais esforço do que a maioria das pessoas gostaria de exercer.) Além disso, é improvável que cdaceite nomes de diretórios com caracteres arbitrários, incluindo espaços neles. , como acontece no Windows.

Caso você esteja se perguntando por que isso funciona no Windows, mas não no Ubuntu: No Windows, os comandos recebem o texto digitado depois deles como umsequência de texto, e quando um comando precisa interpretar essa string como uma sequência de argumentos separados (o que geralmente acontece, mas nem sempre), o código do comando deve chamar uma função de biblioteca especial que analisa a string da linha de comando. (Em um programa C, isso acontece nos bastidores, mas ainda envolve o uso da API do Windows.)

informação relacionada