Как уменьшить размер Debian [закрыто]

Ну, "$@" расширяется до списка позиционных параметров, по одному аргументу на позиционный параметр.

Когда вы делаете:

set '' 'foo bar' $'blah\nblah'
cmd "$@"

cmd вызывается с этими 3 аргументами: пустая строка, foo bar и blahblah. Оболочка вызовет системный вызов execve() с чем-то вроде:

execve("/path/to/cmd", ["cmd", "", "foo bar", "blah\nblah"], [envvars...]);

Если вы хотите восстановить командную строку оболочки (то есть код на языке оболочки), которая воспроизвела бы тот же вызов, вы можете сделать что-то вроде:

awk -v q="'" '
  function shellquote(s) {
    gsub(q, q "\\" q q, s)
    return q s q
  }
  BEGIN {
    for (i = 1; i < ARGC; i++) {
      printf "%s", sep shellquote(ARGV[i])
      sep = " "
    }
    printf "\n"
  }' cmd "$@"

Или с помощью zsh, запрашивая различные типы кавычек:

$ set '' 'foo bar' $'blah\nblah'
$ print -r -- cmd "${(q)@}"
cmd '' foo\ bar blah$'\n'blah
$ print -r -- cmd "${(qq)@}"
cmd '' 'foo bar' 'blah
blah'
$ print -r -- cmd "${(qqq)@}"
cmd "" "foo bar" "blah
blah"
$ print -r -- cmd "${(qqqq)@}"
cmd $'' $'foo bar' $'blah\nblah'

Или с zsh, bash или ksh93 (здесь для bash, YMMV для других оболочек):

$ set '' 'foo bar' $'blah\nblah'
$ printf cmd; printf ' %q' "$@"; printf '\n'
cmd '' foo\ bar $'blah\nblah'

Вы также можете использовать опцию оболочки xtrace, которая заставляет оболочку печатать то, что она собирается выполнить:

$ (PS4=; set -x; : cmd "$@")
: cmd '' 'foo bar' 'blah
blah'

Выше мы выполнили команду : no-op с cmd и позиционными параметрами в качестве аргумента. Моя оболочка напечатала их в красивой форме с кавычками, пригодной для повторного ввода в оболочку. Не все оболочки делают это.

-1
19.10.2015, 00:31
0 ответов

Теги

Похожие вопросы