Exportar la variable $ PATH, línea por línea

22

Inspirado por esta pregunta en AskUbuntu.

Tu trabajo es extremadamente simple. Tome la variable de entorno PATH ( echo $PATH) y expórtela de modo que cada entrada (separada por el :carácter) esté en su propia línea.

Por ejemplo, si la RUTA es /bin:/usr/bin:/usr/local/bin, su programa debería generar:

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

Es posible que su programa no devuelva una nueva línea inicial, pero puede devolver una nueva línea final. No necesita verificar si la RUTA es correcta o si el directorio existe. Su programa no debe recibir ninguna entrada, lo que significa que su programa es responsable de obtener la RUTA misma. Puede asumir con seguridad que los objetos en la RUTA no contienen :líneas nuevas. Sin embargo, los espacios son un juego justo.

Las implementaciones de referencia están presentes en las respuestas a la pregunta anterior.

Reglas

  • Este es (obviamente) código golf, por lo que la respuesta más corta ganará la preciada marca de verificación verde.
  • La respuesta aceptada se probará para asegurarse de que sea realmente legítima.
  • Se aceptan las entradas de Windows y * nix.
    • Sin embargo, si no especifica explícitamente Windows, intentaré ejecutarlo en Linux y fallaré. (Si es obvio (¡hola, Batch!), No necesita especificarlo explícitamente).
  • Solo tiene una solución por respuesta. Si tiene una versión de Windows y * nix, contaré la versión más corta.
  • Si dos respuestas tienen la misma longitud, daré prioridad a la que tenga el total de votos más alto. Si tienen el mismo total de votos, contaré el anterior. Si el tiempo publicado es el mismo, elegiré el que se ejecute más rápido. Si se ejecutan en la misma cantidad de tiempo, no lo sé.

Tabla de clasificación

Kaz Wolfe
fuente
Ahh! Fue difícil visitar la pregunta AskUbuntu sin dar algunos consejos de golf.
Roman Gräf
Algunas de las respuestas (shell) parecen suponer que la ruta no contiene espacios. ¿Deberían ser corregidos?
Dennis
@Dennis Normalmente, la variable de ruta no debe tener espacios, pero como pueden, deben corregirse. Sin embargo, podemos asumir con seguridad que las rutas en sí no contendrán: o una nueva línea.
Kaz Wolfe
¿Es aceptable una función?
corvus_192
@ corvus_192 A menos que el desafío indique explícitamente lo contrario, las funciones están permitidas.
Dennis

Respuestas:

12

Z shell (zsh), 13 bytes

<<<${(F)path}

Utiliza el $pathparámetro , que es un parámetro de matriz especial utilizado por el shell que está vinculado al $PATHparámetro, y un indicador de expansión de parámetros para unir una matriz con nuevas líneas.

Millas
fuente
3
Aparentemente uno hace de golf fuera simplemente @Dennis ... Huh.
wizzwizz4
¿Cómo alias alguna palabra a esto? Lo intenté alias path="<<<${(F)path}"pero cuando se ejecuta se imprime y /usr/local/bin zsh: no such file or directory: /Library/Apple/usr/bin zsh: no such file or directory: /Library/Apple/binluego va asbin
Daniel Springer
@DanielSpringer $ path se está expandiendo durante la definición de alias, que no desea. Utilice comillas simples en su lugar:alias path='<<<${(F)path}'
GammaFunction
¡@GammaFunction que funcionó! ¿Por qué las comillas dobles no funcionan?
Daniel Springer
@DanielSpringe No hay mucho espacio aquí para explicar, aquí hay un pastebin: ix.io/1RyW
GammaFunction
13

Bash / Coreutils, 17 16 bytes

tr : '
'<<<$PATH
Sergiy Kolodyazhnyy
fuente
tr : '\n'<<<$PATHdebería funcionar también
Arnauld
Lo hace . . . edición ahora mismo
Sergiy Kolodyazhnyy
Creo que también puedes eliminar los espacios <<<(probado solo en Ubuntu)
Arnauld
@Arnauld, no creo que eso sea solo Ubuntu, es algo malo, así que debería funcionar en todas las distribuciones
Sergiy Kolodyazhnyy
66
No guarda ningún byte, pero usar en \\nlugar de la variable citada es más legible en mi humilde opinión.
Dennis
10

Lote, 41 bytes

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

PATHestá delimitado por punto y coma en Windows, por supuesto. Convenientemente,for divide en punto y coma de forma predeterminada, pero de manera inconveniente, también en espacios, por lo que tengo que usar un truco de reemplazo de cadena para citar cada elemento de ruta antes de dividirlo. Luego queda eliminar las comillas después.

Neil
fuente
1
Ejecutando desde la línea de comandos puede reemplazar %%con %guardar 2 bytes.
DavidPostill
@DavidPostill ¿No sería eso un fragmento de código en lugar de un programa?
Neil
No estoy seguro de cuáles son las reglas exactas del código de golf, pero ¿la mayoría de las otras respuestas no son solo fragmentos? La mayoría de ellos requieren una "cáscara" de algún tipo para funcionar ...
DavidPostill
9

Z shell (zsh), 15 bytes

<<<${PATH//:/
}

Puede probar el código en Anarchy Golf : haga clic en usar formulario , seleccione zsh , pegue el código y envíelo.

Bash (puro), 19 bytes

echo "${PATH//:/
}"

La misma idea, pero con la sintaxis menos golfosa de Bash. Pruébalo en Ideone .

Dennis
fuente
6

Powershell, 20 bytes

$env:PATH-split':'

Editar:

  • -2 bytes desactivados. Gracias a @TimmyD

Antiguo:

$env:PATH.split(":")
Roman Gräf
fuente
5

Rubí, 25 bytes

puts ENV["PATH"].split":"
Anwar
fuente
Agradable, un poco más corto que mi respuesta a la pregunta original sobre AskUbuntu
Sergiy Kolodyazhnyy
No necesita contar la invocación de Ruby, solo el programa en sí mismo, por lo que solo tiene 26 bytes.
Jordan
@ Jordan no lo sabía. ¿Está en Preguntas frecuentes?
Anwar
@ Jordan Se muestra en el recorrido en sí. Entonces, editado. Gracias por decir eso
Anwar
1
Ah, también puede cambiar split ":"a split":"o split ?:de 1 byte.
Jordan
4

Perl, 22 bytes

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

Necesita -Eo -M5.010correr:

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

Bash + Python, 43 bytes

Usemos la expansión variable de shell. Elimina las llamadas os.environ, por lo tanto, menos código y menos importaciones. Eso nos da 46 bytes, y con xnorel truco y la eliminación de espacio antes de que -ctengamos 43 bytes.

python -c"print('$PATH'.replace(*':\n'))"
Sergiy Kolodyazhnyy
fuente
Tenga en cuenta que esto falla si aparece un directorio con una comilla simple o una barra diagonal inversa en su RUTA.
Joey Marianer
@JoeyMarianer Dado que puede haber casi cualquier carácter en la cadena de nombre de archivo / ruta, entonces sí, esto puede fallar y porque PATH se expandirá a '/ dir'1: / dir2', lo que da un comando con formato incorrecto a python. La barra diagonal inversa no necesariamente falla: solo interpreta lo que hay en la cadena. En mi humilde opinión, los escapes de barra invertida no deberían aparecer en los nombres de ruta normales del usuario, por lo que para el 99% de los casos esto está bien. Sin embargo, estoy de acuerdo: esto debe tenerse en cuenta cada vez que trate con shell directa o indirectamente como en este 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'));
    }
}
NoddySevens
fuente
3

GNU sed+ bash, 25 bytes:

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

Si el PATHno contiene ningún nombre de directorio con espacios en blanco, no se necesitan comillas, 23 bytes:

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

Incluso más corto, transliterando :a nueva línea, gracias a @Dennis :

sed y/:/\\n/<<<"$PATH"
heemayl
fuente
3

Vim, 19 bytes

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

Agarra $PATHdesde el registro de expresiones y pégalo. Convierte la :s en nuevas líneas. Nada complicado

udioica
fuente
Deberían poner esto en los tutoriales de Vim. Como alguien que lee sobre cómo entrar en Vim, aprecio este ejemplo.
loa_in_
2

PHP, 36 35 33 32 bytes

Guardado 1 byte, gracias a Blackhole
Guardado 2 bytes, gracias a user59178
guardado 1 byte, gracias a Martijn

* versión nix

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

Versión de Windows

<?=strtr(getenv(PATH),";","
")?>
Arnauld
fuente
1
@ RomanGräf *nixes solo una forma de referirse a un sistema tipo Unix .
Arnauld
1
Si desea una versión "multiplataforma", puede usar la constantePATH_SEPARATOR
Ismael Miguel
1
No lo use \n, pero en cambio, una verdadera nueva línea le ahorrará un byte.
Blackhole
1
también puedes soltar el "s PATH. Recibes un aviso de "uso de constante indefinida" pero aún funciona, ahorrándote 2 bytes.
user59178
1
El uso del eco corto <?=strtr(getenv(PATH),":","")?>ahorra un byte (* no se puede marcar en los comentarios)
Martijn
2

Python 2, 49 bytes

Ahorrando 2 bytes gracias a @xnor y 1 byte reemplazando environcon getenvgracias a @Serg y @Oliver

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

Para Python 3, solo agregue (y )alrededor del printargumento y agregue 1 al recuento de bytes.

Karl Napf
fuente
¿Cómo obtendrá esto la entrada?
Anwar
2
@Anwar de os.environ ['PATH'], eso devolverá la cadena
Sergiy Kolodyazhnyy
1
@Serg ah. lo tengo.
Anwar
2
replacepuede tomar argumentos llenos replace(*':\n').
xnor
3
@KarlNapf Sí, ese es el punto. Este programa tal cual no se ejecuta en Python 3, por lo que debe especificar la versión con la que funciona.
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]);}
Karl Napf
fuente
1

Raqueta 39 bytes

Usando el comando sed de @heemayl:

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

Sin golf:

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

Pruebas:
(f)

Salida:

/usr/local/bin
/usr/bin
/bin
/usr/games
/usr/lib/java/bin
/usr/lib/java/jre/bin
#t
rnso
fuente
1

Scala, 31 bytes

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

En scala, a b ces azúcar sintáctico para a.b(c), así que esto compila parasys.env("PATH").replace(':','\n')

corvus_192
fuente
1

Perl 6 ,  28 25  24 bytes

%*ENV<PATH>.split(':')».put
put %*ENV<PATH>~~tr/:/\n/
put %*ENV<PATH>~~tr/:/
/
Brad Gilbert b2gills
fuente
1

C #, 64 bytes

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

Función anónima que devuelve la variable de ruta, cada directorio en una línea separada. Tenga en cuenta que xes solo un objeto ficticio para guardar 1 byte en lugar 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));
        }
    }
}

También funciona en sistemas UNIX si se reemplaza ;con :, suponiendo bibliotecas Mono están disponibles. Pruébelo en línea en ideone , .NET Fiddle devuelve una excepción de seguridad.

Alternativamente, un programa completo de C #, que es bastante detallado:


C #, 118 bytes

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

Haskell, 72 bytes

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

Una importación costosa y no replacedentro de la biblioteca estándar lo hace bastante largo.

nimi
fuente
seguramente m ':'...no necesita ese espacio?
gato
1
@cat: el espacio es obligatorio, porque 'es un carácter válido dentro de los identificadores. Sin espacio definiríamos una función llamada m'.
nimi
1

C (x86), 60 bytes

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

Esto no funcionará en plataformas de 64 bits sin incluir stdlib.h , ya que getenv devuelve un int (32 bits) mientras que char punteros son 64 bits de ancho.

Todavía tengo que encontrar un compilador de C en línea de 32 bits.

C (x86-64), 70 bytes

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

En lugar de incluir stdlib.h , declaramos getenv nosotros mismos como una función que devuelve un carácter puntero.

He probado esto con gcc y clang en Linux; otras configuraciones pueden llorar sangre. Pruébalo en Ideone .

Dennis
fuente
1

Factor , 28 bytes

para unix-likes. No sé cómo hacerlo en Windows ya que no estoy en un cuadro de Windows.

"PATH"getenv ":" "\n"replace
gato
fuente
1

jq, 18 caracteres

(Código de 16 caracteres + opción de línea de comando de 2 caracteres)

env.PATH/":"|.[]

Ejecución de muestra:

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
hombre trabajando
fuente
1

Awk, 51 44 caracteres

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

Gracias a:

  • ninjalj por sugerir usar en gsub()lugar de manipular variables incorporadas (-7 caracteres)

La awkforma típica sería configurar las variables integradas que influyen en cómo awkmanipula los datos automáticamente:

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

Ejecución de muestra:

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
hombre trabajando
fuente
Doh Tienes razón, @ninjalj. awkDebía concentrarme en hacerlo de manera específica. Gracias.
manatwork
0

Node.js, 36 bytes

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

Muy claro.

Huntro
fuente
0

MATLAB, 34 bytes

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

Aquí hay una demostración en línea en Octave con una ligera modificación ya que strrepen octava requiere que la segunda y la tercera entrada sean charvariables en lugar de valores numéricos.

Suever
fuente
0

Groovy, 43 Bytes

System.env['PATH'].replaceAll(":","\n")​​​​
Urna de pulpo mágico
fuente
0

Gema, 36 personajes

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

Ejecución de muestra:

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
hombre trabajando
fuente
0

Befunge-98 + huella digital EVAR, 34 bytes

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

Carga la huella digital EVAR ( "RAVE"4() para acceder fácilmente a las variables de entorno, obtiene el PATH envvar ( "HTAP"G), y para cada carácter, sale del programa si el carácter es "\ 0" ( :!k@), resta ASCII 48 "0" si el carácter es ASCII 58 ":" ( :':-!'0*-), y genera el carácter ( ,).

ninjalj
fuente
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

Fuente 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="
ninjalj
fuente