Могут ли псевдонимы использовать позиционные параметры?

Использовать dd для извлечения определенной части файла?

Давайте немного поправим ваш синтаксис.

bs=1

Установите размер блока равным единице, потому что любое количество или пропуск, которые вы хотите, чтобы были в отдельных блоках или байтах.

skip=518358

Пропустить указанное количество блоков или байтов в начале потока.

count=50311

Скопируйте столько блоков или байтов из потока.

dd if=/path/file of=/path/result bs=1 count=50311 skip=518358

2
20.06.2021, 12:37
2 ответа

Нет, и это работает , потому что $1пусто обычно [1] и не заключено в кавычки. Результирующая команда из see fooбудет see foo.

Если вы процитировали его однако как в:

alias see='nano --view "$1"'

Он станет see <empty> foo, и вы откроете новый буфер в дополнение к fooв nano.


[1] $1расширяется до независимо от значения первого позиционного параметра оболочки-в интерактивной оболочке, которая обычно ничего (поскольку интерактивные оболочки обычно не вызываются с позиционными параметрами ), однако ничто не мешает ему установить что-то произвольное (, например, со встроенной оболочкойset/ help set)-set -- foo bar; see baz, например, откроет foo, затем baz.(Свободно скопировано из комментария @steeldriver , так как это важное примечание.)

Так что не верьте, она всегда пуста.


Вы также можете попробовать:

$ alias e='echo @$1@'
$ e foo  <-- would become: echo @$1@ foo
@@ foo
|  |
|  +--- foo is next string
+------ $1 is empty

Под капотом так сказать вы бы увидели что-то вроде:

execve("/bin/nano", ["nano", "--view", "foo"], 0xabc...)

и для цитируемой версии:

execve("/bin/nano", ["nano", "--view", "", "foo"], 0xabc...)

В основной функцииnano

int main(int argc, char *argv[])

argc, (число аргументов )будет равно 3 и 4 соответственно, а argv, (вектор/массив аргументов )будет строками в квадратных скобках.


Вы можете использовать:

alias see='nano --view'

Затем, выпустив:

$ see foo

fooбудет $1, (не совсем $1, а в сравнении ), и команда расширится до:

nano --view foo

Если вам нужно ограничить nano до , откройте только $1, (первый аргумент ),вам понадобится функция, потому что:

see foo bar

расширится доnano --view foo bar

Тогда вы могли бы использовать что-то вроде:

see() {
    nano --view "$1"
}

Тогда вы должны отбросить любой аргумент выше $1, и при вызове execveон всегда будет:

execve("/bin/nano", ["nano", "--view", "filename"], 0xabc...)

где filename— это $1в bash. Nano не увидит $1, только значение. Баш позаботится об этом.


При использовании функции оболочки аргументы определяются как позиционные параметры, $1, $2, $3, …, и функция имеет к ним доступ. Псевдоним не рассматривается как функция, поэтому он не имеет доступа к этим параметрам / они не существуют.

Попробуйте:

alias p1='echo "$# $1 END"'
p2() { echo "$# $1 END"; }

Результат:

$ p1 a b c
0  END a b c

$ p2 a b c
3 a END


Как правило, руководство Bash утверждает:

For almost every purpose, shell functions are preferred over aliases.

и

There is no mechanism for using arguments in the replacement text, as in csh. If arguments are needed, a shell function should be used (see Shell Functions).


Для записи shellcheck, см. вики для SC2142 .

3
28.07.2021, 11:23

Псевдонимы не принимают аргументов , они просто копируются как есть. Они кажутся на (иногда )работают (вроде ). Но это не так.

Использовать функцию оболочки.

0
28.07.2021, 11:23

Теги

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