Использовать dd для извлечения определенной части файла?
Давайте немного поправим ваш синтаксис.
bs=1
Установите размер блока равным единице, потому что любое количество или пропуск, которые вы хотите, чтобы были в отдельных блоках или байтах.
skip=518358
Пропустить указанное количество блоков или байтов в начале потока.
count=50311
Скопируйте столько блоков или байтов из потока.
dd if=/path/file of=/path/result bs=1 count=50311 skip=518358
Нет, и это работает , потому что $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 .
Псевдонимы не принимают аргументов , они просто копируются как есть. Они кажутся на (иногда )работают (вроде ). Но это не так.
Использовать функцию оболочки.