逐行导出$ PATH变量


22

受到AskUbuntu上这个问题的启发。

您的工作非常简单。获取PATH环境变量(echo $PATH)并将其导出,以使每个条目(由:字符分隔)都位于其自己的行上。

例如,如果PATH为/bin:/usr/bin:/usr/local/bin,则程序应输出:

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

您的程序可能不会返回前导换行符,但可能会返回单个尾随换行符。您无需检查PATH是否正确或目录是否存在。您的程序不应输入任何内容,这意味着您的程序负责获取PATH本身。您可以放心地假设PATH中的对象不包含:或换行符。但是,空间是公平的游戏。

在上述问题的答案中提供了参考实现。

规则

  • (显然)这是代码高尔夫球,因此最短的答案将赢得宝贵的绿色对勾。
  • 接受的答案将经过测试以确保它是合法的。
  • Windows和* nix条目均被接受。
    • 但是,如果您未明确指定Windows,我将尝试在Linux中运行它并失败。(如果很明显(嗨,Batch!),则无需显式指定。)
  • 每个答案只有一个解决方案。如果您同时拥有Windows和* nix版本,我将计算较短的版本。
  • 如果两个答案的长度相同,我将优先考虑总票数较高的一个。如果他们的投票总数相同,我将计算较大的一票。如果发布的时间相同,我将选择执行速度更快的时间。如果它们执行的时间相同,我不知道。

排行榜


啊!不打高尔夫球就很难访问AskUbuntu问题。
罗曼·格拉夫(RomanGräf)

一些(shell)答案似乎假设该路径不包含空格。应该纠正它们吗?
丹尼斯

@Dennis通常,路径变量不应包含空格,但应尽可能将其更正。但是,我们可以安全地假设路径本身将不包含:或换行符。
卡兹·沃尔夫

功能可以接受吗?
corvus_192 '16

@ corvus_192除非挑战另有明确说明,否则允许使用功能。
丹尼斯

Answers:


12

Z Shell(zsh),13个字节

<<<${(F)path}

使用$path参数,它是用于通过在所述壳中的特殊阵列参数$PATH参数和参数扩展标志加入用换行的阵列。


3
显然一个人确实只是在高尔夫之外@Dennis ...呵呵。
wizzwizz4 2016年

如何给这个词加上别名?我试过alias path="<<<${(F)path}",但在执行时它打印/usr/local/bin zsh: no such file or directory: /Library/Apple/usr/bin zsh: no such file or directory: /Library/Apple/bin然后去sbin
丹尼尔·斯普林格

@DanielSpringer $ path在别名定义期间被扩展,这是您不想要的。改用单引号:alias path='<<<${(F)path}'
GammaFunction

@GammaFunction起作用了!为什么双引号工作?
Daniel Springer

@DanielSpringe这里没有太多空间可以解释,这是一个pastebin:ix.io/1RyW
GammaFunction

13

Bash / Coreutils,17个16字节

tr : '
'<<<$PATH

tr : '\n'<<<$PATH应该也可以正常工作
Arnauld

确实如此。。。立即编辑
Sergiy Kolodyazhnyy,2016年

我认为您也可以删除周围的空格<<<(仅在Ubuntu上测试过)
Arnauld

@Arnauld我不认为这只是Ubuntu的事情,这是bash的事情,因此应该在发行版中正常工作
Sergiy Kolodyazhnyy

6
它不会保存任何字节,但是使用\\nimho代替引号变量更易读。
丹尼斯

10

批次,41个字节

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

PATH在Windows上当然是用分号分隔的。方便地,for默认情况下在分号上进行拆分,但在空格上也很不方便,因此在拆分之前,我必须使用字符串替换技巧来引用每个路径元素。然后剩下的就是删除引号。


1
从命令行运行,可以替换%%%节省2个字节。
DavidPostill '16

@DavidPostill难道不是代码片段而不是程序吗?
尼尔

我不确定高尔夫球规则的确切代码是什么,但是其他大多数答案不是也都是摘要吗?他们大多数都需要运行某种描述的“外壳”才能运行
DavidPostill

9

Z Shell(zsh),15个字节

<<<${PATH//:/
}

您可以在Anarchy Golf上测试代码:单击使用表单”,选择“ zsh”,粘贴代码并提交。

Bash(纯),19个字节

echo "${PATH//:/
}"

同样的想法,但使用的是Bash不太复杂的语法。在Ideone上进行测试


6

Powershell,20个字节

$env:PATH-split':'

编辑:

  • -2个字节。感谢@TimmyD

旧:

$env:PATH.split(":")

5

Ruby,25个字节

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

不错,比我对AskUbuntu上的原始问题的回答要短一点
Sergiy Kolodyazhnyy

您无需计算Ruby调用,仅计算程序本身,因此仅26个字节。
约旦

@乔丹不知道。在常见问题中吗?
安华

@Jordan在巡回演出中已显示。所以,编辑。感谢您告诉我们
Anwar

1
哦,您也可以更改split ":"split":"split ?:1个字节。
约旦

4

Perl,22个字节

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

需要-E还是-M5.010要跑:

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

3

Bash + Python,43个字节

让我们使用shell的变量扩展。它消除了调用os.environ,从而减少了代码并减少了导入。这给了我们46个字节,并带有xnor技巧并在-c我们有43个字节之前删除了空间。

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

请注意,如果PATH中出现带有单引号或反斜杠的目录,则此操作将失败。
Joey Marianer '16

@JoeyMarianer因为文件名/路径字符串中几乎可以包含任何字符,所以可以-这可能会失败,并且如果PATH将扩展为'/ dir'1:/ dir2',则会向python提供格式错误的命令。反斜杠不一定会失败-只是解释字符串本身是什么。恕我直言,反斜杠转义符不应出现在普通用户的路径名中,因此对于99%的情况,这是可以的。但是,我同意-在这种情况下,无论您直接还是间接处理shell,都应牢记这一点
Sergiy Kolodyazhnyy 16-10-16

3

Java,58个字节

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

完整程序:106字节

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

3

GNU sed+ bash,25个字节:

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

如果PATH不含带空格的目录名称,则无需引用,共23个字节:

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

:由于@Dennis,甚至更短,音译为换行符:

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

3

Vim,19个字节

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

$PATH从表达式寄存器中抓取并将其粘贴。将:s换行。没什么棘手的。


他们应该将其放在Vim教程中。当有人读到如何进入Vim时,我很欣赏这个例子。
loa_in_

2

PHP,36 35 33 32字节

节省了1个字节,感谢Blackhole
节省了2个字节,感谢user59178
节省了1个字节,感谢Martijn

* nix版本

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

Windows版本

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

1
@RomanGräf *nix只是引用类Unix系统的一种方式。
Arnauld

1
如果需要“多平台”版本,则可以使用常量PATH_SEPARATOR
Ismael Miguel

1
不要使用\n,而是使用真正的换行符,它将为您节省一个字节。
黑洞

1
您也可以将"s放到周围PATH。您会收到“使用未定义的常量”的通知,但它仍然有效,为您节省了2个字节。
user59178 '16

1
使用短回声可以保证<?=strtr(getenv(PATH),":","")?>一个字节的安全(注释中不能使用换行符)
Martijn

2

Python 2,49字节

保存2通过替换字节由于@xnor和1个字节environgetenv由于@Serg和@Oliver

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

对于Python 3,只需在参数周围加上()print然后在字节数上加1。


How will this get the input?
Anwar

2
@Anwar from os.environ['PATH'] , that will return the string
Sergiy Kolodyazhnyy

1
@Serg ah. got it.
Anwar

2
replace can take packed arguments replace(*':\n').
xnor

3
@KarlNapf Yea, thats the point. This program as-is does not run in Python 3, so you should specify the version it works with.
Denker

2

C, 85 84 bytes

-1 byte for using #import

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

1

Racket 39 bytes

Using sed command of @heemayl :

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

Ungolfed:

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

Testing:
(f)

Output:

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

In scala, a b c is syntactic sugar for a.b(c), so this compiles to sys.env("PATH").replace(':','\n')



1

C#, 64 bytes

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

Anonymous function which returns the path variable, each directory on a separate line. Note that x is just a dummy object to save 1 byte instead of using ().

Full program:

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

Also works on UNIX systems if you replace ; with :, presuming Mono libraries are available. Try it online on ideone, .NET Fiddle returns a security exception.

Alternatively, a full C# program, which is rather verbose:


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

An expensive import and no replace within the standard library make it quite long.


surely m ':'... doesn't need that space?
cat

1
@cat: the space is mandatory, because ' is a valid character within identifiers. Without space we'd define a function named m'.
nimi

1

C (x86), 60 bytes

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

This won't work on 64-bit platforms without including stdlib.h, since getenv returns an int (32 bits) while char pointers are 64 bits wide.

I have yet to find an online 32-bit C compiler.

C (x86-64), 70 bytes

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

Instead of including stdlib.h, we declare getenv ourselves as a function returning a char pointer.

I've tested this with gcc and clang on Linux; other setups may cry blood. Try it on Ideone.


1

Factor, 28 bytes

for unix-likes. I dunno how to do it on Windows since I'm not at a Windows box.

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

1

jq, 18 characters

(16 characters code + 2 characters command line option)

env.PATH/":"|.[]

Sample run:

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 characters

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

Thanks to:

  • ninjalj for suggesting to use gsub() instead of manipulating built-in variables (-7 characters)

The typical awk way would be to set up the built-in variables which influences how awk manipulates the data automatically:

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

Sample run:

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. You are right, @ninjalj. I was to focused on doing it in awk-specific way. Thank you.
manatwork

0

Node.js, 36 bytes

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

Pretty straight forward.


0

MATLAB, 34 bytes

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

Here is an online demo in Octave with a slight modification since strrep in octave requires the second and third inputs to be char variables rather than numeric values.




0

Gema, 36 characters

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

Sample run:

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 + EVAR fingerprint, 34 bytes

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

Loads the EVAR fingerprint ("RAVE"4() to easily access environment variables, gets the PATH envvar ("HTAP"G), and for each character, exits the program if the character is "\0" (:!k@), substracts ASCII 48 "0" if the char is ASCII 58 ":" (:':-!'0*-), and outputs the character (,).


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

NASM source:

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="
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.