Exporter la variable $ PATH, ligne par ligne

22

Inspiré par cette question sur AskUbuntu.

Votre travail est extrêmement simple. Prenez la variable d'environnement PATH ( echo $PATH) et exportez-la de sorte que chaque entrée (séparée par le :caractère) se trouve sur sa propre ligne.

Par exemple, si le PATH est /bin:/usr/bin:/usr/local/bin, votre programme devrait afficher:

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

Votre programme peut ne pas renvoyer une nouvelle ligne de début, mais il peut renvoyer une seule nouvelle ligne de fin. Vous n'avez pas besoin de vérifier si le CHEMIN est correct ou que le répertoire existe. Votre programme ne devrait prendre aucune entrée, ce qui signifie que votre programme est responsable d'obtenir le PATH lui-même. Vous pouvez supposer en toute sécurité que les objets dans le CHEMIN ne contiennent pas de :nouvelles lignes. Cependant, les espaces sont équitables.

Des implémentations de référence sont présentes dans les réponses à la question ci-dessus.

Règles

  • Il s'agit (évidemment) de code-golf, donc la réponse la plus courte gagnera la coche verte précieuse.
  • La réponse acceptée sera testée pour s'assurer qu'elle est réellement légitime.
  • Les entrées Windows et * nix sont acceptées.
    • Cependant, si vous ne spécifiez pas explicitement Windows, je vais essayer de l'exécuter sous Linux et échouer. (Si c'est évident (salut, Batch!), Vous n'avez pas besoin de le spécifier explicitement.)
  • N'ayez qu'une seule solution par réponse. Si vous avez à la fois une version Windows et * nix, je compterai la version la plus courte.
  • Si deux réponses ont la même longueur, je donnerai la priorité à celle avec le total de votes le plus élevé. S'ils ont le même total de votes, je compterai l'ancien. Si l'heure affichée est la même, je choisirai celle qui s'exécute plus rapidement. S'ils s'exécutent dans le même temps, je ne sais pas.

Classement

Kaz Wolfe
la source
Ahh! Il était difficile de visiter la question AskUbuntu sans donner quelques conseils de golf.
Roman Gräf
Certaines réponses (shell) semblent supposer que le chemin ne contient pas d'espaces. Doivent-ils être corrigés?
Dennis
@Dennis En général, la variable path ne doit pas avoir d'espaces, mais comme ils le peuvent, ils doivent être corrigés. Cependant, nous pouvons supposer en toute sécurité que les chemins eux-mêmes ne contiendront pas: ou une nouvelle ligne.
Kaz Wolfe
Une fonction est-elle acceptable?
corvus_192
@ corvus_192 Sauf indication contraire explicite du défi , les fonctions sont autorisées.
Dennis

Réponses:

12

Shell Z (zsh), 13 octets

<<<${(F)path}

Utilise le $pathparamètre , qui est un paramètre de tableau spécial utilisé par le shell lié au $PATHparamètre, et un indicateur d'extension de paramètre pour joindre un tableau avec des sauts de ligne.

Miles
la source
3
Apparemment, on fait simplement du golf @Dennis ... Huh.
wizzwizz4
Comment alias un mot à cela? J'ai essayé alias path="<<<${(F)path}"mais une fois exécuté, il s'imprime /usr/local/bin zsh: no such file or directory: /Library/Apple/usr/bin zsh: no such file or directory: /Library/Apple/binensuitesbin
Daniel Springer
@DanielSpringer $ path est développé lors de la définition de l'alias, ce que vous ne voulez pas. Utilisez des guillemets simples à la place:alias path='<<<${(F)path}'
GammaFunction
@GammaFunction qui a fonctionné! Pourquoi les guillemets doubles n'ont-ils pas fonctionné?
Daniel Springer
@DanielSpringe Pas beaucoup d'espace ici pour expliquer, voici une boîte à pâte
GammaFunction
13

Bash / Coreutils, 17 16 octets

tr : '
'<<<$PATH
Sergiy Kolodyazhnyy
la source
tr : '\n'<<<$PATHdevrait aussi fonctionner
Arnauld
Cela fait . . . montage en ce moment
Sergiy Kolodyazhnyy
Je pense que vous pouvez également supprimer les espaces autour <<<(testé sur Ubuntu uniquement)
Arnauld
@Arnauld je ne pense pas que ce soit la seule chose Ubuntu, c'est quelque chose de bash, donc devrait fonctionner à travers les distributions
Sergiy Kolodyazhnyy
6
Il n'enregistre aucun octet, mais l'utilisation à la \\nplace de la variable citée est plus lisible à mon humble avis.
Dennis
10

Lot, 41 octets

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

PATHest délimité par des points-virgules sur Windows bien sûr. Commodément, forse fractionne sur les points-virgules par défaut, mais aussi sur les espaces, donc je dois utiliser la chaîne de remplacement pour tracer chaque élément de chemin avant de fractionner. Il reste alors à supprimer les guillemets par la suite.

Neil
la source
1
En cours d'exécution à partir de la ligne de commande, vous pouvez remplacer %%en %économisant 2 octets.
DavidPostill
@DavidPostill Cela n'en ferait-il pas un extrait de code plutôt qu'un programme?
Neil
Je ne sais pas quelles sont les règles exactes du golf, mais la plupart des autres réponses ne sont-elles pas également des extraits? La plupart d'entre eux nécessitent un "shell" d'une certaine description pour fonctionner ...
DavidPostill
9

Shell Z (zsh), 15 octets

<<<${PATH//:/
}

Vous pouvez tester le code sur Anarchy Golf : cliquez sur utiliser le formulaire , sélectionnez zsh , collez le code et soumettez.

Bash (pur), 19 octets

echo "${PATH//:/
}"

Même idée, mais avec la syntaxe moins golfique de Bash. Testez-le sur Ideone .

Dennis
la source
6

Powershell, 20 octets

$env:PATH-split':'

Modifier:

  • -2 octets éteints. Merci à @TimmyD

Vieux:

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

Rubis, 25 octets

puts ENV["PATH"].split":"
Anwar
la source
Agréable, un peu plus court que ma réponse à la question initiale sur AskUbuntu
Sergiy Kolodyazhnyy
Vous n'avez pas besoin de compter l'invocation Ruby, seulement le programme lui-même, ce n'est donc que 26 octets.
Jordan
@Jordan ne le savait pas. Est-ce dans la FAQ?
Anwar
@Jordan C'est montré dans la tournée elle-même. Donc, édité. Merci d'avoir dit cela
Anwar
1
Oh, vous pouvez également passer split ":"à split":"ou split ?:pour 1 octet.
Jordan
4

Perl, 22 octets

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

Besoin -Eou -M5.010pour exécuter:

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

Bash + Python, 43 octets

Utilisons l'expansion variable du shell. Il élimine les appels os.environ, donc moins de code et moins d'importations. Cela nous donne 46 octets, et avec xnorl'astuce et la suppression d'espace avant d' -cavoir 43 octets.

python -c"print('$PATH'.replace(*':\n'))"
Sergiy Kolodyazhnyy
la source
Notez que cela échoue si un répertoire avec un guillemet simple ou une barre oblique inverse apparaît dans votre CHEMIN.
Joey Marianer
@JoeyMarianer Puisqu'il peut y avoir presque n'importe quel caractère dans la chaîne de nom de fichier / chemin, alors oui - cela peut échouer et parce que PATH se développera en '/ dir'1: / dir2', ce qui donne une commande incorrectement formatée à python. La barre oblique inverse n'échoue pas nécessairement - elle interprète simplement le contenu de la chaîne elle-même. À mon humble avis, les échappements antislash ne devraient pas apparaître dans les noms de chemin d'utilisateur normaux, donc pour 99% des cas, c'est OK. Je suis cependant d'accord - cela doit être gardé à l'esprit chaque fois que vous traitez un obus directement ou indirectement comme dans ce cas
Sergiy Kolodyazhnyy
3

Java, 58 octets

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

Programme complet: 106 octets

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

GNU sed+ bash, 25 octets:

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

Si le PATHne contient aucun nom de répertoire avec des espaces, aucune citation nécessaire, 23 octets:

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

Encore plus court, translittérant :en newline, grâce à @Dennis :

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

Vim, 19 octets

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

Saisissez $PATHle registre d'expression et collez-le. Transformez les :s en nouvelles lignes. Rien de compliqué.

udioica
la source
Ils devraient mettre cela dans les tutoriels Vim. En tant que personne lisant comment entrer dans Vim, j'apprécie cet exemple.
loa_in_
2

PHP, 36 35 33 32 octets

1 octet enregistré, grâce à Blackhole
2 octets enregistrés, grâce à user59178
1 octet enregistré, grâce à Martijn

* version nix

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

Version Windows

<?=strtr(getenv(PATH),";","
")?>
Arnauld
la source
1
@ RomanGräf *nixn'est qu'un moyen de faire référence à un système de type Unix .
Arnauld
1
Si vous voulez une version "multi-plateforme", vous pouvez utiliser la constantePATH_SEPARATOR
Ismael Miguel
1
N'utilisez pas \n, mais une véritable nouvelle ligne à la place, cela vous fera économiser un octet.
Blackhole
1
vous pouvez également laisser tomber le "s autour PATH. Vous obtenez un avis "utilisation de constante indéfinie" mais cela fonctionne toujours, vous économisant 2 octets.
user59178
1
L'utilisation de l'écho court <?=strtr(getenv(PATH),":","")?>sécurise un octet (* ne peut pas ajouter de nouvelle ligne dans les commentaires)
Martijn
2

Python 2, 49 octets

Économiser 2 octets grâce à @xnor et 1 octet en remplaçant environpar getenvmerci à @Serg et @Oliver

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

Pour Python 3, ajoutez simplement (et )autour de l' printargument et ajoutez 1 au nombre d'octets.

Karl Napf
la source
Comment cela obtiendra-t-il l'entrée?
Anwar
2
@Anwar de os.environ ['PATH'], qui renverra la chaîne
Sergiy Kolodyazhnyy
1
@Serg ah. je l'ai.
Anwar
2
replacepeut prendre des arguments emballés replace(*':\n').
xnor
3
@KarlNapf Oui, c'est le point. Ce programme tel quel n'est pas exécuté en Python 3, vous devez donc spécifier la version avec laquelle il fonctionne.
Denker
2

C, 85 84 octets

-1 octet pour l'utilisation #import

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

Raquette 39 octets

Utilisation de la commande sed de @heemayl:

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

Non golfé:

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

Test:
(f)

Sortie:

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

Scala, 31 octets

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

En scala, a b cest le sucre syntaxique pour a.b(c), donc cela compile poursys.env("PATH").replace(':','\n')

corvus_192
la source
1

Perl 6 ,  28 25  24 octets

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

C #, 64 octets

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

Fonction anonyme qui renvoie la variable path, chaque répertoire sur une ligne distincte. Notez que xc'est juste un objet factice pour enregistrer 1 octet au lieu d'utiliser ().

Programme complet:

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));
        }
    }
}

Fonctionne également sur les systèmes UNIX si vous remplacez ;par :, en supposant que les bibliothèques Mono sont disponibles. Essayez-le en ligne sur ideone , .NET Fiddle renvoie une exception de sécurité.

Alternativement, un programme C # complet, qui est plutôt verbeux:


C #, 118 octets

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

Haskell, 72 octets

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

Une importation coûteuse et non replacedans la bibliothèque standard la rend assez longue.

nimi
la source
m ':'...n'a sûrement pas besoin de cet espace?
cat
1
@cat: l'espace est obligatoire, car il 's'agit d'un caractère valide dans les identifiants. Sans espace, nous définirions une fonction nommée m'.
nimi
1

C (x86), 60 octets

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

Cela ne fonctionnera pas sur les plates-formes 64 bits sans inclure stdlib.h , car getenv renvoie un int (32 bits) tandis que char pointeurs ont une largeur de 64 bits.

Je n'ai pas encore trouvé de compilateur C 32 bits en ligne.

C (x86-64), 70 octets

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

Au lieu d'inclure stdlib.h , nous déclarons getenv nous-mêmes comme une fonction retournant un char pointeur .

J'ai testé cela avec gcc et clang sous Linux; d'autres configurations peuvent pleurer du sang. Essayez-le sur Ideone .

Dennis
la source
1

Facteur , 28 octets

pour unix-likes. Je ne sais pas comment le faire sur Windows car je ne suis pas dans une boîte Windows.

"PATH"getenv ":" "\n"replace
chat
la source
1

jq, 18 caractères

(Code de 16 caractères + option de ligne de commande de 2 caractères)

env.PATH/":"|.[]

Exemple d'exécution:

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
homme au travail
la source
1

Awk, 51 44 caractères

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

Grâce à:

  • ninjalj pour avoir suggéré d'utilisergsub() au lieu de manipuler des variables intégrées (-7 caractères)

La awkmanière typique serait de configurer les variables intégrées qui influencent la façon dont awkmanipule les données automatiquement:

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

Exemple d'exécution:

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
homme au travail
la source
Doh. Vous avez raison, @ninjalj. Je devais me concentrer sur le faire de awkmanière spécifique. Merci.
manatwork
0

Node.js, 36 octets

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

Assez simple.

Huntro
la source
0

MATLAB, 34 octets

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

Voici une démo en ligne dans Octave avec une légère modification car strrepen octave, les deuxième et troisième entrées doivent être des charvariables plutôt que des valeurs numériques.

Suever
la source
0

Groovy, 43 octets

System.env['PATH'].replaceAll(":","\n")​​​​
Urne de poulpe magique
la source
0

Gema, 36 caractères

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

Exemple d'exécution:

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
homme au travail
la source
0

Befunge-98 + empreinte digitale EVAR, 34 octets

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

Charge l'empreinte digitale EVAR ( "RAVE"4() pour accéder facilement aux variables d'environnement, obtient le PATV envvar ( "HTAP"G) et pour chaque caractère, quitte le programme si le caractère est "\ 0" ( :!k@), soustrait ASCII 48 "0" si le caractère est ASCII 58 ":" ( :':-!'0*-), et sort le caractère ( ,).

ninjalj
la source
0

ELF / x86, 78 octets

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

Source 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
la source