Exportar a variável $ PATH, linha por linha


22

Inspirado por esta pergunta no AskUbuntu.

Seu trabalho é extremamente simples. Pegue a variável de ambiente PATH ( echo $PATH) e exporte-a para que cada entrada (separada pelo :caractere) esteja em sua própria linha.

Por exemplo, se o PATH for /bin:/usr/bin:/usr/local/bin, seu programa deve gerar:

/bin
/usr/bin
/usr/local/bin

Seu programa pode não retornar uma nova linha principal, mas pode retornar uma única nova linha final. Você não precisa verificar se o PATH está correto ou se o diretório existe. Seu programa não deve receber entrada, o que significa que ele é responsável por obter o próprio PATH. Você pode assumir com segurança que os objetos no PATH não contêm :ou novas linhas. No entanto, os espaços são justos.

Implementações de referência estão presentes nas respostas à pergunta acima.

Regras

  • Isso é (obviamente) código-golfe, então a resposta mais curta receberá a marca de seleção verde premiada.
  • A resposta aceita será testada para garantir que seja realmente legítima.
  • As entradas Windows e * nix são aceitas.
    • No entanto, se você não especificar explicitamente o Windows, tentarei executá-lo no Linux e falhará. (Se for óbvio (oi, Lote!), Você não precisa especificar explicitamente.)
  • Tenha apenas uma solução por resposta. Se você possui as versões Windows e * nix, contarei a versão mais curta.
  • Se duas respostas tiverem o mesmo tamanho, darei prioridade à que tiver o maior número de votos. Se eles tiverem o mesmo total de votos, contarei o mais antigo. Se o horário publicado for o mesmo, escolherei o que for executado mais rapidamente. Se eles executam na mesma quantidade de tempo, eu não sei.

Entre os melhores


Ahh! Foi difícil visitar a Pergunta AskUbuntu sem dar algumas dicas de golfe.
Roman Gräf 16/10

Algumas das respostas (shell) parecem assumir que o caminho não contém espaços. Eles devem ser corrigidos?
Dennis

@ Dennis Normalmente, a variável path não deve ter espaços, mas, como podem, devem ser corrigidas. No entanto, podemos assumir com segurança que os próprios caminhos não conterão: ou uma nova linha.
Kaz Wolfe

Uma função é aceitável?
corvus_192

@ corvus_192 A menos que o desafio diga explicitamente o contrário, as funções são permitidas.
Dennis

Respostas:


12

Shell Z (zsh), 13 bytes

<<<${(F)path}

Usa o $pathparâmetro , que é um parâmetro de matriz especial usado pelo shell que está vinculado ao $PATHparâmetro, e um sinalizador de expansão de parâmetro para ingressar em uma matriz com novas linhas.


3
Aparentemente, um faz de golfe fora simplesmente @ Dennis ... Huh.
wizzwizz4

Como alias alguma palavra para isso? Eu tentei, alias path="<<<${(F)path}"mas quando executado imprime, em /usr/local/bin zsh: no such file or directory: /Library/Apple/usr/bin zsh: no such file or directory: /Library/Apple/binseguida, vai parasbin
Daniel Springer

O @DanielSpringer $ path está sendo expandido durante a definição de alias, o que você não deseja. Use aspas simples:alias path='<<<${(F)path}'
GammaFunction

@GammaFunction que funcionou! Por que aspas duplas não funcionaram?
Daniel Springer

@DanielSpringe Não há muito espaço aqui para explicar, aqui está uma pasta
GammaFunction

13

Bash / Coreutils, 17 16 bytes

tr : '
'<<<$PATH

tr : '\n'<<<$PATHdeve funcionar também #
214 Arnauld

Faz. . . editando agora
Sergiy Kolodyazhnyy 15/10

Eu acho que você pode remover os espaços em torno <<<bem (testado no Ubuntu somente)
Arnauld

@Arnauld eu não acho que é Ubuntu única coisa, é coisa bash, assim deve funcionar em frente ao distros
Sergiy Kolodyazhnyy

6
Ele não salva bytes, mas usar em \\nvez da variável citada é imho mais legível.
Dennis

10

Lote, 41 bytes

@for %%a in ("%PATH:;=";"%")do @echo %%~a

PATHé delimitado por ponto e vírgula no Windows, é claro. Convenientemente, fordivide-se em ponto-e-vírgula por padrão, mas inconvenientemente, também em espaços, por isso tenho que usar truques de substituição de string para citar cada elemento do caminho antes de dividir. Resta então remover as aspas posteriormente.


1
Executando a partir da linha de comando, você pode substituir %%por %salvar 2 bytes.
DavidPostill

@DavidPostill Isso não tornaria um trecho de código em vez de um programa?
Neil

Não sei ao certo quais são as regras exatas do código de golfe, mas a maioria das outras respostas também não são apenas trechos? A maioria deles exigem um "shell" de alguma descrição para executar ...
DavidPostill

9

Shell Z (zsh), 15 bytes

<<<${PATH//:/
}

Você pode testar o código no Anarchy Golf : clique em usar formulário , selecione zsh , cole o código e envie.

Bash (puro), 19 bytes

echo "${PATH//:/
}"

A mesma idéia, mas com a sintaxe menos golfista de Bash. Teste em Ideone .


6

Powershell, 20 bytes

$env:PATH-split':'

Editar:

  • -2 bytes desativados. Obrigado a @TimmyD

Velho:

$env:PATH.split(":")

5

Ruby, 25 bytes

puts ENV["PATH"].split":"

Bom, um pouquinho mais curto do que minha resposta na pergunta original no AskUbuntu #
Sergiy Kolodyazhnyy 15/10

Você não precisa contar a chamada do Ruby, apenas o próprio programa, portanto, são apenas 26 bytes.
Jordan

@ Jordan não sabia disso. Está no FAQ?
Anwar

@ Jordan É mostrado na própria turnê. Então, editado. Obrigado por dizer isso
Anwar

1
Ah, você também pode alterar split ":"para split":"ou split ?:para 1 byte.
Jordan

4

Perl, 22 bytes

say$ENV{PATH}=~y/:/
/r

Precisa -Eou -M5.010é executado:

perl -E 'say$ENV{PATH}=~y/:/
/r'

3

Bash + Python, 43 bytes

Vamos usar a expansão variável do shell. Elimina a chamada os.environ, portanto, menos código e menos importações. Isso nos dá 46 bytes, e com xnoro truque e a remoção de espaço antes de -ctermos 43 bytes.

python -c"print('$PATH'.replace(*':\n'))"

Observe que isso falhará se um diretório com aspas simples ou uma barra invertida aparecer no seu PATH.
Joey Marianer

@JoeyMarianer Como pode haver quase qualquer caractere no nome do arquivo / caminho, então sim - isso pode falhar e o PATH se expandirá para '/ dir'1: / dir2', que fornece um comando formatado incorretamente para o python. A barra invertida não necessariamente falha - apenas interpreta o que está na própria string. IMHO, escapes de barra invertida não devem aparecer nos nomes de caminho do usuário normal, portanto, para 99% dos casos, isso está OK. I no entanto concordam - este deve ser mantido em mente quando você lidar com shell direta ou indiretamente, como neste caso
Sergiy Kolodyazhnyy

3

Java, 58 bytes

System.out.print(System.getenv("Path").replace(';','\n'));

Programa completo: 106 bytes

class E {
    public static void main (String[] args) {
        System.out.print(System.getenv("Path").replace(';', '\n'));
    }
}

3

GNU sed+ bash, 25 bytes:

sed 's/:/\n/g' <<<"$PATH"

Se PATHnão houver um nome de diretório com espaço em branco, nenhuma citação será necessária, 23 bytes:

sed 's/:/\n/g' <<<$PATH

Ainda mais curto, transliterando :para a nova linha, graças a @Dennis :

sed y/:/\\n/<<<"$PATH"

3

Vim, 19 bytes

"=$PATH<CR>p:s/:/\r/g<CR>

Pegue $PATHno registro de expressão e cole-o. Transforme :s em novas linhas. Nada complicado.


Eles devem colocar isso nos tutoriais do Vim. Como alguém lendo sobre como entrar no Vim, aprecio este exemplo.
loa_in_ 16/10

2

PHP, 36 35 33 32 bytes

Guardado 1 byte, graças ao Blackhole
Guardado 2 bytes, graças ao user59178
guardado 1 byte, graças ao Martijn

* versão nix

<?=strtr(getenv(PATH),":","
")?>

Versão do Windows

<?=strtr(getenv(PATH),";","
")?>

1
@ RomanGräf *nixé apenas uma maneira de se referir a um sistema semelhante ao Unix .
Arnauld 16/10

1
Se você quer uma versão "multi-plataforma", você pode usar a constantePATH_SEPARATOR
Ismael Miguel

1
Não use \n, mas uma nova linha verdadeira poupará um byte.
Blackhole

1
você também pode soltar os "s ao redor PATH. Você recebe um aviso de "uso de constante indefinida", mas ainda funciona, economizando 2 bytes.
user59178

1
Usar o eco curto <?=strtr(getenv(PATH),":","")?>protege um byte (* não pode ser uma nova linha nos comentários) #
287 Martijn

2

Python 2, 49 bytes

Salvando 2 bytes graças a @xnor e 1 byte, substituindo environpor getenvobrigado a @Serg e @Oliver

import os
print os.getenv('PATH').replace(*':\n')

Para Python 3, basta adicionar (e )contornar o printargumento e adicionar 1 à contagem de bytes.


Como isso vai receber a entrada?
Anwar

2
@Anwar do os.environ ['PATH'], que retornará a string
Sergiy Kolodyazhnyy 15/10

1
@ Ah ah. consegui.
Anwar

2
replacepode levar argumentos compactados replace(*':\n').
Xnor

3
@KarlNapf Sim, esse é o ponto. Este programa como está não é executado no Python 3, portanto, você deve especificar a versão com a qual trabalha.
Denker

2

C, 85 84 bytes

-1 byte para usar #import

#import<stdlib.h>
main(){char*a=getenv("PATH");while(*a)putchar(*a++==58?10:a[-1]);}

1

Raquete 39 bytes

Usando o comando sed de @heemayl:

(system "sed 's/:/\\n/g' <<<\"$PATH\"")

Ungolfed:

(define (f)
  (system "sed 's/:/\\n/g' <<<\"$PATH\"")
)

Teste:
(f)

Saída:

/usr/local/bin
/usr/bin
/bin
/usr/games
/usr/lib/java/bin
/usr/lib/java/jre/bin
#t

1

Scala, 31 bytes

sys env "PATH"replace(':','\n')

Em scala, a b cé o açúcar sintático para a.b(c), então isso compila parasys.env("PATH").replace(':','\n')



1

C #, 64 bytes

x=>Environment.GetEnvironmentVariable("PATH").Replace(";","\n");

Função anônima que retorna a variável de caminho, cada diretório em uma linha separada. Observe que xé apenas um objeto fictício para salvar 1 byte em vez de usar() .

Programa completo:

using System;

namespace ExportPathVariable
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<object,string>f= x=>Environment.GetEnvironmentVariable("PATH").Replace(";","\n");

            Console.WriteLine(f(0));
        }
    }
}

Também funciona em sistemas UNIX se você substituir ; por :, presumindo que as bibliotecas Mono estejam disponíveis. Experimente online no ideone , o .NET Fiddle retorna uma exceção de segurança.

Como alternativa, um programa C # completo, que é bastante detalhado:


C #, 118 bytes

using System;class P{static void Main(){Console.Write(Environment.GetEnvironmentVariable("PATH").Replace(";","\n"));}}

1

Haskell, 72 bytes

import System.Environment
m ':'='\n'
m x=x 
map m<$>getEnv"PATH">>=putStr

Uma importação cara e não replacedentro da biblioteca padrão a tornam bastante longa.


certamente m ':'...não precisa desse espaço?
cat

1
@cat: o espaço é obrigatório, porque 'é um caractere válido nos identificadores. Sem espaço, definiríamos uma função denominada m'.
N /

1

C (x86), 60 bytes

f(){char*p=getenv("PATH");for(;*p;p++)putchar(*p-58?*p:10);}

Isso não funcionará em plataformas de 64 bits sem incluir stdlib.h , pois o getenv retorna um int (32 bits) enquanto ponteiros de char têm 64 bits de largura.

Ainda não encontrei um compilador C de 32 bits online.

C (x86-64), 70 bytes

f(){char*getenv(),*p=getenv("PATH");for(;*p;p++)putchar(*p-58?*p:10);}

Em vez de incluir stdlib.h , declaramos getenv como uma função retornando um caracter ponteiro de .

Eu testei isso com gcc e clang no Linux; outras configurações podem chorar sangue. Experimente em Ideone .


1

Fator , 28 bytes

para curtidas de unix. Não sei como fazê-lo no Windows, pois não estou em uma caixa do Windows.

"PATH"getenv ":" "\n"replace

1

jq, 18 caracteres

(Código de 16 caracteres + opção de linha de comando de 2 caracteres)

env.PATH/":"|.[]

Exemplo de execução:

bash-4.3$ PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'

bash-4.3$ jq -nr 'env.PATH/":"|.[]'
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin

1

Awk, 51 44 caracteres

BEGIN{$0=ENVIRON["PATH"];gsub(":",RS);print}

Graças a:

  • ninjalj por sugerir o uso em gsub()vez de manipular variáveis internas (-7 caracteres)

A awkmaneira típica seria configurar as variáveis ​​internas que influenciam como awkmanipula os dados automaticamente:

BEGIN{FS=":";OFS=RS;$0=ENVIRON["PATH"];$1=$1;print}

Exemplo de execução:

bash-4.3$ PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'

bash-4.3$ awk 'BEGIN{FS=":";OFS=RS;$0=ENVIRON["PATH"];$1=$1;print}'
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin

Doh. Você está certo, @ninjalj. Eu estava focado em fazê-lo de awkmaneira específica. Obrigado.
manatwork

0

Node.js, 36 bytes

_=>process.env.PATH.split`:`.join`
`

Bem direto.


0

MATLAB, 34 bytes

disp(strrep(getenv('PATH'),58,10))

Aqui está uma demonstração online no Octave com uma ligeira modificação desdestrrep no oitavo é necessário que a segunda e a terceira entradas sejam charvariáveis, e não valores numéricos.




0

Gema, 36 caracteres

\A=@subst{\\:=\\n;@getenv{PATH}}@end

Exemplo de execução:

bash-4.3$ PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'

bash-4.3$ gema '\A=@subst{\\:=\\n;@getenv{PATH}}@end'
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin

0

Impressão digital Befunge-98 + EVAR, 34 bytes

"RAVE"4("HTAP"Gv
:!k@:':-!'0*-, >

Carrega a impressão digital EVAR ( "RAVE"4() para acessar facilmente as variáveis ​​de ambiente, obtém o PATH envvar ( "HTAP"G) e, para cada caractere, sai do programa se o caractere for "\ 0" ( :!k@), substrata ASCII 48 "0" se o caractere for ASCII 58 ":" ( :':-!'0*-) e gera o caractere ( ,).


0

ELF / x86, 78 bytes

00000000  7f 45 4c 46 01 00 00 00  43 0f 00 00 43 5f eb 10  |.ELF....C...C_..|
00000010  02 00 03 00 0c 50 eb 10  0c 50 eb 10 04 00 00 00  |.....P...P......|
00000020  5f 5f b1 05 be 49 50 eb  10 3d 20 00 01 00 5f f3  |__...IP..= ..._.|
00000030  a6 75 ef 89 f9 80 3f 3a  75 03 80 2f 30 42 ae 75  |.u....?:u../0B.u|
00000040  f4 4a 04 04 cd 80 93 cd  80 50 41 54 48 3d        |.J.......PATH=|
0000004e

Fonte NASM:

BITS 32                                         ;
ORG 0x10eb5000                                  ;
                                                ;   ELF HEADER    --   PROGRAM HEADER
; ELF HEADER                                    ; +-------------+
DB 0x7f,'E','L','F'                             ; | magic       |    +--------------------+
                                                ; |             |    |                    |
; PROGRAM HEADERS                               ; |             |    |                    |
DD 1                                            ; |*class   32b | -- | type: PT_LOAD      |
                                                ; |*data   none |    |                    |
                                                ; |*version   0 |    |                    |
                                                ; |*ABI    SysV |    |                    |
DD 0xf43        ; offset = vaddr & (PAGE_SIZE-1); |*ABI vers    | -- | offset             |
                                                ; |             |    |                    |
entry:  inc     ebx     ; STDOUT_FILENO         ; |*PADx7       | -- | vaddr = 0x10eb5f43 |
        pop     edi     ; discard argc          ; |             |    |                    |
        jmp     short skip                      ; |             |    |                    |
DW 2                                            ; | ET_EXEC     | -- |*paddr LO           |
DW 3                                            ; | EM_386      | -- |*paddr HI           |
DD 0x10eb500c                                   ; |*version     | -- | filesz             |
DD 0x10eb500c                                   ; | entry point | -- | memsz              |
DD 4                                            ; | ph offset   | -- | flags: RX          |
                                                ; |             |    |                    |
skip:   pop     edi     ; discard argv[0]       ; |*sh offset   | -- |*align              |
        pop     edi     ; discard argv[1]=NULL  ; |             |    |                    |
env:    mov     cl,5    ; \ strlen("PATH=")     ; |             |    |                    |
        mov     esi,PATH; > "PATH="             ; |*flags    /--|    |                    |
DB 0x3d         ; cmp eax,0x10020               ; |*ehsize      |    +--------------------+
DW 32                                           ; | phentsize   |
DW 1                                            ; | phnum       |
                                                ; |             |
        pop     edi     ; > envp                ; |*shentsize   |
        repe    cmpsb   ; > strcmp(envp,"PATH="); |*shnum       |
        jne     env     ; /                     ; |*shstrndx    |
        mov     ecx,edi                         ; +-------------+

nlcolon:cmp     byte[edi],58  ; \ if (char == ':')
        jne     nosub         ; >
        sub     byte[edi],48  ; >   char -= '0'
nosub:  inc     edx           ; > wlen++
        scasb                 ; >
        jne     nlcolon       ; / while(char != 0)

        dec     edx           ; wlen--
        add     al,4
        int     0x80          ; write(1, ecx, wlen)
        xchg    eax,ebx
        int     0x80          ; exit(...)

PATH: db "PATH="
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.