переменная удара формата для команды

Чтобы получить Dvorak на «внешней» клавиатуре, его необходимо вручную выбрать в настройках, выбрав «Настройки»> «Основные»> «Клавиатура»> «Аппаратная клавиатура»> «Английский (США)» и затем выбрав «Dvorak». Конечно, после сброса он просто возвращается в Qwerty.

По сути, «Используйте тот же язык клавиатуры, что и в macOS» для Дворжака. Это может быть связано с тем, что он не является настройкой программной клавиатуры.

6
задан stew 19 January 2009 в 20:03
поделиться

4 ответа

В Bash, printf обеспечивается оболочкой (см. удар (1) страница справочника, ищите "printf"), таким образом, у Вас даже нет (минимальных) издержек fork() и exec() выполнить отдельную команду - если Вы не выполняете его из обратных галочек. Встроенный printf Bash позволяет Вам присвоить вывод данной переменной с -v аргумент; Ваш фрагмент сценария мог быть переписан как:

for ((i=23; i<42;i++)); do 
    printf -v ii "%02i\n" $i
    sh ../myprogram $ii
done

Я не уверен, что полагал бы что более читаемый, чем оригинал.

Самая ресурсоемкая часть Вашего фрагмента сценария называет Ваш другой сценарий оболочки; я не волновался бы об издержках вызова printf, если новые доказательства не указывают иначе.

отредактированный для добавления различия между обратными галочками и прямым выполнением

21
ответ дан 8 December 2019 в 03:28
поделиться

Ваше число уже имеет 2 десятичных разряда. Почему необходимо использовать printf затем? Если я помню правильно (не имейте оболочки для тестирования здесь), оно просто заполняет число до 2 десятичных чисел при использовании с теми флагами. Лично, мне нравится xargs:

seq 23 42 | xargs -n1 sh ../myprogram 

Можно использовать -w аргумент в пользу seq, который заполняет числа нулями при необходимости, таким образом, они имеют весь одинаковый ширина.

Это складывается seq конкретный Linux. Спасибо за Dave в комментариях для понимания его (его ответ). Использовать printf непосредственно, без цикла:

printf '%02i\n' {23..42} | xargs -n1 sh ../myprogram 

Мне нравится использовать xargs, потому что это позволяет легко выполнять Ваши команды параллельно некоторый предел, может передать больше чем одно число сразу и позволяет другие гибкие опции. Как Dave, я рекомендую Вам отбросить sh от него, и место он в Ваш сценарий оболочки, как первая строка вместо этого:

#!/bin/sh
.....

Затем просто выполните свой материал как

printf '%02i\n' {23..42} | xargs -n1 ../myprogram

Это более универсально, и позволяет Вашему сценарию также быть названным exec Вызовы библиотеки C (по крайней мере, в Linux, это имеет место).

6
ответ дан 8 December 2019 в 03:28
поделиться

К вашему сведению: совершенно другое решение:

jot -w "%02i" - 23 42 | xargs -n 1 ../myprogram

Это имеет оборотную сторону производительности вызова капли (стандарт с тех пор 4.2BSD, таким образом, все производные BSD имеют его, но беглый взгляд показывает, что этому основному замечательному инструменту, кажется, недостает от дистрибутивов Linux, я смотрел на).Править: Linux (по крайней мере, Red Hat), кажется, имеет подмножество функций капли в команде, названной seq (благодаря ответу litb для этой информации).

Это обладает преимуществом работы в оболочках неудара также (в отличие от того, что думают некоторые люди, существует больше чем одна оболочка в активном использовании, и агностическими оболочкой решениями обычно является хорошая идея).

2
ответ дан 8 December 2019 в 03:28
поделиться

Как насчет

for i in {23..42} ; do
    sh ../myprogram $i
done

Числа между 23 и 42 всегда будут в %02i формате.

Если абсолютно необходимо отформатировать, то

for i in {23..42} ; do
    printf "%02i\n" | xargs -n1 sh ../myprogram $i
done

Заменяет издержками порождения xargs для издержек порождения подоболочки для обратных галочек. Я понятия не имею, который более эффективен.

1
ответ дан 8 December 2019 в 03:28
поделиться