Ekspor Variabel $ PATH, Baris-demi-Baris


22

Terinspirasi oleh pertanyaan ini di AskUbuntu.

Pekerjaan Anda sangat sederhana. Ambil variabel lingkungan PATH ( echo $PATH) dan eksporlah sehingga setiap entri (dipisahkan oleh :karakter) ada di barisnya masing-masing.

Misalnya, jika PATH adalah /bin:/usr/bin:/usr/local/bin, program Anda harus menampilkan:

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

Program Anda mungkin tidak mengembalikan baris baru, tetapi dapat mengembalikan baris baru. Anda tidak perlu memeriksa apakah PATH benar, atau direktori ada. Program Anda tidak boleh menerima input, artinya program Anda bertanggung jawab untuk mendapatkan PATH itu sendiri. Anda dapat dengan aman berasumsi bahwa objek dalam PATH tidak mengandung :atau baris baru. Namun, ruang adalah permainan yang adil.

Implementasi referensi ada dalam jawaban atas pertanyaan di atas.

Aturan

  • Ini (jelas) golf kode, jadi jawaban terpendek akan memenangkan tanda centang hijau berharga.
  • Jawaban yang diterima akan diuji untuk memastikan itu benar-benar sah.
  • Entri Windows dan * nix diterima.
    • Namun, jika Anda tidak secara spesifik menentukan Windows, saya akan mencoba menjalankannya di Linux dan gagal. (Jika sudah jelas (hai, Batch!), Anda tidak perlu menentukan secara eksplisit.)
  • Hanya punya satu solusi per jawaban. Jika Anda memiliki versi Windows dan * nix, saya akan menghitung yang lebih pendek.
  • Jika dua jawaban memiliki panjang yang sama, saya akan memprioritaskan jawaban dengan total suara lebih tinggi. Jika mereka memiliki total suara yang sama, saya akan menghitung yang lebih tua. Jika waktu yang diposting sama, saya akan memilih yang mengeksekusi lebih cepat. Jika mereka mengeksekusi dalam jumlah waktu yang sama, saya tidak tahu.

Papan peringkat


Ahh! Sulit untuk mengunjungi Pertanyaan AskUbuntu tanpa memberikan tip golf.
Roman Gräf

Beberapa jawaban (shell) tampaknya berasumsi bahwa path tidak mengandung spasi. Haruskah mereka dikoreksi?
Dennis

@ Dennis Biasanya, variabel path seharusnya tidak memiliki spasi, tetapi jika mereka bisa, mereka harus diperbaiki. Namun, kami dapat dengan aman berasumsi bahwa jalur itu sendiri tidak akan berisi: atau baris baru.
Kaz Wolfe

Apakah fungsi dapat diterima?
corvus_192

@ corvus_192 Kecuali jika tantangan secara eksplisit mengatakan sebaliknya, fungsi diizinkan.
Dennis

Jawaban:


12

Z shell (zsh), 13 byte

<<<${(F)path}

Menggunakan $pathparameter , yang merupakan parameter array khusus yang digunakan oleh shell yang terkait dengan $PATHparameter, dan bendera ekspansi parameter untuk bergabung dengan array dengan baris baru.


3
Rupanya salah satu tidak hanya keluar-golf @Dennis ... Huh.
wizzwizz4

Bagaimana cara mengucapkan beberapa kata untuk ini? Saya mencoba alias path="<<<${(F)path}"tetapi ketika dieksekusi mencetak /usr/local/bin zsh: no such file or directory: /Library/Apple/usr/bin zsh: no such file or directory: /Library/Apple/binkemudian pergi kesbin
Daniel Springer

@DanielSpringer $ path sedang diperluas selama definisi alias, yang tidak Anda inginkan. Gunakan tanda kutip tunggal sebagai gantinya:alias path='<<<${(F)path}'
GammaFunction

@GammaFungsi yang berhasil! Mengapa tanda kutip ganda tidak berfungsi?
Daniel Springer

@DanielSpringe Tidak banyak ruang di sini untuk menjelaskan, ini pastebin: ix.io/1RyW
GammaFunction

13

Bash / Coreutils, 17 16 byte

tr : '
'<<<$PATH

tr : '\n'<<<$PATHharus bekerja juga
Arnauld

Itu benar. . . mengedit sekarang
Sergiy Kolodyazhnyy

Saya pikir Anda dapat menghapus spasi di sekitar <<<juga (diuji pada Ubuntu saja)
Arnauld

@Arnauld saya tidak berpikir itu hanya Ubuntu, itu bash, jadi harus bekerja di seluruh distro
Sergiy Kolodyazhnyy

6
Itu tidak menyimpan byte, tetapi menggunakan \\nbukannya variabel yang dikutip lebih mudah dibaca.
Dennis

10

Batch, 41 byte

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

PATHdibatasi titik koma di Windows tentu saja. Mudah, formembagi pada titik koma secara default, tetapi tidak nyaman, juga pada spasi, jadi saya harus menggunakan string ganti tipu daya untuk mengutip setiap elemen jalan sebelum membelah. Kemudian tetap menghapus tanda kutip sesudahnya.


1
Berjalan dari baris perintah yang dapat Anda ganti %%dengan %menyimpan 2 byte.
DavidPostill

@ DavidPostill Bukankah itu membuatnya potongan kode daripada program?
Neil

Saya tidak yakin apa aturan golfnya, tetapi bukankah sebagian besar jawaban lain hanya cuplikan saja? Kebanyakan dari mereka memerlukan "shell" dari beberapa deskripsi untuk menjalankan ...
DavidPostill

9

Z shell (zsh), 15 byte

<<<${PATH//:/
}

Anda dapat menguji kode pada Golf Anarki : klik formulir penggunaan , pilih zsh , rekatkan kode dan kirim.

Bash (murni), 19 byte

echo "${PATH//:/
}"

Gagasan yang sama, tetapi dengan sintaksis Bash yang kurang golf. Uji di Ideone .


6

Powershell, 20 byte

$env:PATH-split':'

Edit:

  • Off -2 byte. Terima kasih kepada @TimmyD

Tua:

$env:PATH.split(":")

5

Ruby, 25 byte

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

Bagus, sedikit lebih pendek dari jawaban saya pada pertanyaan asli di AskUbuntu
Sergiy Kolodyazhnyy

Anda tidak perlu menghitung permohonan Ruby, hanya programnya sendiri, jadi ini hanya 26 byte.
Jordan

@ Jordan tidak tahu itu. Apakah itu di FAQ?
Anwar

@ Jordan Ini ditampilkan dalam tur itu sendiri. Jadi diedit. Terima kasih telah mengatakan itu
Anwar

1
Oh, Anda juga dapat mengubah split ":"ke split":"atau split ?:untuk 1 byte.
Jordan

4

Perl, 22 byte

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

Perlu -Eatau -M5.010untuk dijalankan:

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

3

Bash + Python, 43 byte

Mari kita gunakan ekspansi variabel shell. Ini menghilangkan panggilan os.environ, sehingga lebih sedikit kode dan lebih sedikit impor. Itu memberi kita 46 byte, dan dengan xnortrik dan menghapus ruang sebelum -ckita punya 43 byte.

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

Perhatikan bahwa ini gagal jika direktori dengan kutipan tunggal atau garis miring terbalik muncul di PATH Anda.
Joey Marianer

@ JoeyMarianer Karena hampir semua karakter dalam string nama file / path, maka ya - ini mungkin gagal dan karena PATH akan diperluas ke '/ dir'1: / dir2', yang memberikan perintah yang diformat secara tidak benar ke python. Backslash tidak selalu gagal - ia hanya menginterpretasikan apa yang ada dalam string itu sendiri. IMHO, garis miring terbalik tidak akan muncul dalam nama jalur pengguna normal, jadi untuk 99% kasus, ini OK. Namun saya setuju - ini harus diingat kapan saja Anda berurusan dengan shell secara langsung atau tidak langsung seperti dalam kasus ini
Sergiy Kolodyazhnyy

3

Java, 58 byte

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

Program lengkap: 106 byte

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

3

GNU sed+ bash, 25 byte:

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

Jika PATHtidak mengandung nama direktori dengan spasi, tidak perlu mengutip, 23 byte:

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

Bahkan lebih pendek, transliterasi :ke baris baru, terima kasih kepada @Dennis :

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

3

Vim, 19 byte

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

Raih $PATHdari daftar ekspresi dan tempel. Ubah :s menjadi baris baru. Tidak ada yang rumit.


Mereka harus memasukkan ini ke dalam tutorial Vim. Sebagai seseorang yang membaca tentang cara masuk ke Vim, saya menghargai contoh ini.
loa_in_

2

PHP, 36 35 33 32 byte

Disimpan 1 byte, terima kasih kepada Blackhole
Disimpan 2 byte, terima kasih kepada pengguna59178
disimpan 1 byte, terima kasih kepada Martijn

* versi nix

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

Versi Windows

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

1
@ RomanGräf *nixhanyalah cara merujuk ke sistem mirip Unix .
Arnauld

1
Jika Anda menginginkan versi "multi-plataform", Anda dapat menggunakan konstantaPATH_SEPARATOR
Ismael Miguel

1
Jangan gunakan \n, melainkan baris baru yang benar, itu akan menghemat satu byte.
Blackhole

1
Anda juga dapat menjatuhkan "sekitar PATH. Anda mendapat pemberitahuan "penggunaan konstanta tidak terdefinisi" tetapi tetap berfungsi, menghemat 2 byte.
user59178

1
Menggunakan <?=strtr(getenv(PATH),":","")?>brankas gema pendek satu byte (* tidak dapat baris baru dalam komentar)
Martijn

2

Python 2, 49 byte

Menyimpan 2 byte berkat @xnor dan 1 byte dengan mengganti environdengan getenvterima kasih kepada @Serg dan @Oliver

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

Untuk Python 3, cukup tambahkan (dan )sekitar printargumen dan tambahkan 1 ke jumlah byte.


Bagaimana ini akan mendapatkan input?
Anwar

2
@Anwar dari os.environ ['PATH'], yang akan mengembalikan string
Sergiy Kolodyazhnyy

1
@ Ah ah oke.
Anwar

2
replacedapat mengambil argumen yang dikemas replace(*':\n').
xnor

3
@ KarlNapf Ya, itu intinya. Program as-is ini tidak berjalan dalam Python 3, jadi Anda harus menentukan versi kerjanya.
Denker

2

C, 85 84 byte

-1 byte untuk digunakan #import

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

1

Racket 39 byte

Menggunakan perintah sed dari @heemayl:

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

Tidak Disatukan:

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

Pengujian:
(f)

Keluaran:

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

1

Scala, 31 byte

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

Dalam scala, a b cadalah gula sintaksis untuk a.b(c), jadi ini dikompilasi menjadisys.env("PATH").replace(':','\n')



1

C #, 64 byte

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

Fungsi anonim yang mengembalikan variabel jalur, setiap direktori pada baris terpisah. Perhatikan bahwa xini hanyalah objek tiruan untuk menyimpan 1 byte alih-alih menggunakan ().

Program lengkap:

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

Juga berfungsi pada sistem UNIX jika Anda menggantinya ;dengan :, anggap perpustakaan Mono tersedia. Cobalah online di ideone , .NET Fiddle mengembalikan pengecualian keamanan.

Atau, program C # lengkap, yang agak bertele-tele:


C #, 118 byte

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

1

Haskell, 72 byte

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

Impor yang mahal dan tidak ada replacedalam perpustakaan standar membuatnya cukup lama.


pasti m ':'...tidak membutuhkan ruang itu?
kucing

1
@cat: spasi wajib, karena 'karakter yang valid dalam pengidentifikasi. Tanpa spasi, kami akan mendefinisikan fungsi bernama m'.
nimi

1

C (x86), 60 byte

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

Ini tidak akan bekerja pada platform 64-bit tanpa menyertakan stdlib.h , karena getenv mengembalikan int (32 bit) sementara pointer char lebar 64 bit.

Saya belum menemukan kompiler C 32-bit online.

C (x86-64), 70 byte

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

Alih-alih memasukkan stdlib.h , kami mendeklarasikan getenv sebagai fungsi mengembalikan pointer char .

Saya sudah menguji ini dengan gcc dan dentang di Linux; setup lain mungkin menangis darah. Cobalah di Ideone .


1

Faktor , 28 byte

untuk unix-likes. Saya tidak tahu bagaimana melakukannya di Windows karena saya tidak berada di kotak Windows.

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

1

jq, 18 karakter

(16 karakter kode + 2 opsi opsi baris perintah)

env.PATH/":"|.[]

Contoh dijalankan:

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 karakter

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

Terimakasih untuk:

  • ninjalj untuk menyarankan penggunaan gsub()daripada memanipulasi variabel bawaan (-7 karakter)

Cara tipikal awkadalah mengatur variabel bawaan yang memengaruhi cara awkmemanipulasi data secara otomatis:

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

Contoh dijalankan:

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. Anda benar, @ninjalj. Saya harus fokus melakukannya dengan awkcara-spesifik. Terima kasih.
manatwork

0

Node.js, 36 byte

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

Cukup lurus ke depan.


0

MATLAB, 34 byte

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

Berikut ini adalah demo online dalam Oktaf dengan sedikit modifikasi karena strrepdalam oktaf membutuhkan input kedua dan ketiga menjadi charvariabel daripada nilai numerik.




0

Gema, 36 karakter

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

Contoh dijalankan:

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 + sidik jari EVAR, 34 byte

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

Memuat sidik jari EVAR ( "RAVE"4() untuk dengan mudah mengakses variabel lingkungan, mendapatkan PATH envvar ( "HTAP"G), dan untuk setiap karakter, keluar dari program jika karakternya adalah "\ 0" ( :!k@), kurangi ASCII 48 "0" jika karakternya adalah ASCII 58 ":" ( :':-!'0*-), dan menampilkan karakter ( ,).


0

ELF / x86, 78 byte

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

Sumber 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="
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.