Попытайтесь использовать двойные кавычки вместо сингла. http://www.gnu.org/s/bash/manual/html_node/Double-Quotes.html
Или запись его этот путь:
myawk () { awk '{print '"$1"' }'; }
Но я вижу много плохих побочных эффектов с попыткой включать необработанные пользовательские строки. Например:
myawk '"hello"; system("echo there")"
Это оценить как awk '{print "hello"; system("echo there") }'
, который может отобразиться "привет" и "там; но более злонамеренные команды могли быть отправлены если не оставленные правильно.
Можно использовать xargs
:
locate filename123 | xargs vi
По умолчанию xargs
выполнит как можно меньше экземпляров указанной команды, передавая как можно больше параметров согласно ARG_MAX системы. Ограничить количество параметров передало экземпляру vi
, использовать xargs
' -n
опция.
Обработать имена файлов, содержащие использование пробелов xargs
' -d
опция:
locate filename123 | xargs -d '\n' vi
Обработать имена файлов, содержащие использование новых строк xargs
' -0
опция вместе с locate
-0
опция:
locate -0 filename123 | xargs -0 vi
(Если -0
не доступно ни на одном из них, проверьте на --null
также, или другой способ указать символ \000
как разделитель.)
Вы могли использовать расширение команды:
vi "$(locate filename123 | head -n1)"
Сделать vim
считайте его stdin, который можно сделать vim -
, но это просто даст Вам вывод locate
которые являются путями имени файла. Это могло бы работать хотя, с помощью vim
gf
нормальная команда затем откроет путь, что курсор идет.
В случае имен файлов с пробелами в них Вы лучше из использования xargs
опция упоминается или vim
решение, описанное выше. Отметьте для создания gf
работайте необходимо добавить пространство к isfname
:
set isfname+=32
Эта подсказка и альтернативы описаны здесь.
Добавленные кавычки и head
как предложено PeterO в комментариях.
another
и file
:(.
– Santosh Kumar
18.08.2012, 15:20
vi "$(locate filename123)"
... Чтобы гарантировать, что это имеет только одно имя файла для контакта с: vi "$(locate filename123 |head -n1)"
– Peter.O
18.08.2012, 20:49
Самый простой способ - передать locate
как подстановку оболочки , например:
vim $(locate filename123)
Вы также можете использовать find
вместо locate
для передачи имен файлов для редактирования, например:
find . -name 'filename123' -exec vim {} +
В Unix / OSX вы можете использовать xargs
с параметром -o
, например:
locate filename123 | xargs -o vim
-o
Повторно откройте stdin как / dev / tty в дочернем процессе перед выполнением команды. Это полезно, если вы хотите, чтобы xargs запускал интерактивное приложение.
Или в Linux попробуйте следующее обходное решение, используя:
locate filename123 | xargs -J% sh -c 'vim < /dev/tty $@'
Если вы используете другие команды, используйте подстановку команд , чтобы добиться этого, например:
vim $(locate filename123)
vim `locate filename123`
В качестве альтернативы используйте GNU parallel
] вместо xargs
, чтобы принудительно выделить tty, в примере:
locate filename123 | parallel -X --tty vi
Примечание: parallel
в Unix / OSX не будет работать, поскольку он имеет другие параметры и не поддерживает tty .
Многие другие популярные команды также обеспечивают выделение псевдо-tty (например, -t
в ssh
), поэтому обратитесь за помощью.
Другим предложением было бы использовать vipe
(командный канал Vim) или следующий простой скрипт:
#!/bin/sh
# usage: locate filename123 | vip
exec vim < /dev/tty "$@"
Связанный:
locate
управляйте, как введено к vi. Vi, как любая другая программа, ожидает, что название файла (файлов) продолжит работать как аргументы. – Gilles 'SO- stop being evil' 18.08.2012, 15:13