2015-09-23 2 views
2

Я пытаюсь редактировать мой .bashrc файл с помощью специальной функции для запуска xwin. Я хочу, чтобы он мог открываться в нескольких окнах, поэтому я решил создать функцию, которая принимает 1 параметр: номер дисплея. Вот мой код:Ошибка «команда не найдена»

function test(){ 
    a=$(($1-0)) 
    "xinit -- :$a -multiwindow -clipboard &" 
} 

Причина, почему я создал переменную «а», чтобы держать вход, потому что я подозревал, что вход читался в виде строки, а не числа. Я надеялся, что, сделав шаг, когда я вычтем вход на 0, будет преобразован в целое число, но на самом деле я не уверен, что это будет или нет. Теперь, когда я звоню

test 0 

Я дал ошибку

-bash: xinit -- :0 -multiwindow -clipboard &: command not found 

Как я могу это исправить? Благодаря!

+1

'xinit -": $ a "-multiwindow -clipboard &' – PSkocik

+2

Если вы укажете его, bash будет искать исполняемый файл с именем [[вся вещь с пробелами и т. Д.]]. – PSkocik

+2

'' 'все еще строка; 'bash' не имеет другого типа. Однако то, что он * делает *, интерпретирует строки как числа, когда это необходимо (например, внутри '$ ((...))'). Просто используйте '$ 1', где вы будете использовать' $ a'. – chepner

ответ

6

Поскольку цитируемый команда весь выступает в качестве самой команды:

$ "ls" 
a b c 
$ "ls -1" 
-bash: ls -1: command not found 

избавиться от двойных кавычек, окружающих ваш xinit:

xinit -- ":$a" -multiwindow -clipboard & 
6

В дополнение к двойной кавычки епископ указал существует также ряд других проблем с этой функцией:

  • test - это стандартная и очень важная команда. Не переопределяйте его! Если вы делаете, вы рискуете имея некоторый скрипт (или считанного файла, или любой другой) пробег:

    if test $num -eq 5; then ... 
    

    Какой будет выстрелить xinit на некоторое случайное число окон, а затем продолжить сценарий, как если бы $ номер был равен 5 (действительно ли это на самом деле). Этот путь - безумие.

  • Как отметил chepner в комментарии, bash действительно не имеет целочисленного типа. Для него целое число - это всего лишь строка, которая содержит только цифры (и, возможно, «-» спереди), поэтому преобразование в целое является нерабочей. Но то, что вы, возможно, захотите сделать, это проверить, не отключен ли параметр. Вы можете либо проверить, является ли $1 пустым (например, if [[ -z "$1" ]]; then echo "Usage: ..." >&2 и т. Д.), Либо указать значение по умолчанию, например. ${1:-0} (в этом случае по умолчанию используется «0»).

  • И, наконец, не используйте ключевое слово function. Баш терпит его, но он нестандартен и не делает ничего полезного.

Итак, вот что я получаю как очищенную вверх версии функции:

launchxwin() { 
    xinit -- ":${1:-0}" -multiwindow -clipboard & 
} 
6

Это происходит потому, что Баш интерпретирует все внутри кавычек как String. Команда представляет собой массив строк, первый элемент которого представляет собой двоичный файл или внутреннюю команду оболочки. Последующие строки в массиве принимаются как аргумент.

При вводе:

"xinit -- :$a -multiwindow -clipboard &" 

оболочка считает, что все, что вы написали команду. В зависимости от команды/программы, которую вы запускали, все остальные аргументы могут быть одной строкой. Но в основном вы используете кавычки, только если вы передаете аргумент, который имеет пробелы внутри как:

mkdir "My Documents" 

Это создает единый каталог с именем My Documents. Кроме того, вы можете избежать пробелов, подобных этому.

mkdir My\ Documents 

Но помните, что «$» является особым символом типа «\». Он интерпретируется оболочкой как переменная. «$ a» будет заменено его значением перед выполнением. Если вы используете простую цитату ('$ a'), она не будет интерпретироваться оболочкой.

Кроме того, «&» это специальный символ, который выполняет команду в фоновом режиме. Вы должны, вероятно, передать его и вне цитат.

Смежные вопросы