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


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.


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

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.


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 .


6

Powershell, 20 octets

$env:PATH-split':'

Modifier:

  • -2 octets éteints. Merci à @TimmyD

Vieux:

$env:PATH.split(":")

5

Rubis, 25 octets

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

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'

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'))"

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

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"

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é.


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),";","
")?>

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.


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

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

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')



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

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.


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 .


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

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

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

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.


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.




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

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 ( ,).


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="
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.