如何在Zsh中从$ PATH中删除路径并将其添加到开头而不重复?

时间:2013-04-23 18:05:54

标签: zsh

我有:

PATH=/bar:/foo

我想:

PATH=/foo:/bar

我不想要:

PATH=/foo:/bar:foo

所以我在想,假设默认路径是PATH=/bar,我可以修改$path$PATH作为关联数组):

function prepend_to_path() {
  unset $path[(r)$1]
  path=($1 $path)
}

prepend_to_path /foo

但是抱怨:

prepend_to_path:unset:1: not enough arguments

已经很久了,我甚至不记得(r)的用途,但没有它(unset $path[$1])我得到了:

prepend_to_path:1: bad math expression: operand expected at `/home/nerd...'

我做错了什么?

2 个答案:

答案 0 :(得分:6)

您可以使用以下函数替换函数体:

path=($1 ${(@)path:#$1})

相关答案:https://stackoverflow.com/a/3435429/1107999

答案 1 :(得分:2)

这也有效(并且在几个月后回到它时可以说更容易阅读):

      <form [ngFormModel]="loginForm">
        <p>
          <input type="text" ngControl="usernameX" required placeholder="usernameX" /><br>
          valid {{usernameX.valid}}
        </p>
        <p>
          <input type="text" ngControl="passwordX" required placeholder="passwordX"/><br>
          valid {{passwordX.valid}}
        </p>

        <my-form-input [placeholder]="'usernameXX'" [required]="true" [control]="usernameXX"></my-form-input><br>
        valid {{usernameXX.valid}}

        <p>form is valid: {{loginForm.valid}}</p>
      </form>

@Component({ selector: 'my-form-input', directives: [ FORM_DIRECTIVES ], template: ` <div> <p> <input type="text" [attr.placeholder]="placeholder" [attr.required]="required" [attr.ngControl]="control"/><br> valid {{control.valid}} </p> </div> ` }) export class InputComponent implements OnInit { @Input() placeholder: string; @Input() required: boolean; @Input() control: Control; 会自动对数组进行重复数据删除,只保留每个元素的第一次出现。

由于prepend_to_path () { path[1,0]=$1 typeset -U path } 相当于typeset -U,你也可以export一石二鸟。

编辑: typeset -gx只需要应用于特定数组一次,因此可以在一个shell的启动中的某个地方执行此操作,并从上面的函数中删除该行。