Явное указание пути к исполняемому файлу заставит оболочку попытаться использовать этот путь для выполнения исполняемого файла.
Если сказать ./myscript
и если myscript
не находится в текущем каталоге, вы получите сообщение об ошибке «Нет такого файла или каталога». Это означает, что не использует переменную $PATH
.
$PATH
должен быть:
-разделенным списком каталогов (, а не файлов ), в которых оболочка будет искать исполняемые файлы, если в командной строке не указан путь. Добавление текущего каталога(.
)к переменной PATH
(представляет собой потенциальную угрозу безопасности, см. " Безопасно ли добавлять. в мой PATH? Почему? " ).
Другое простое решение, когда вы просто хотите получить доступ к одному исполняемому файлу за пределами вашего обычного $PATH
— это использовать псевдоним:
alias myscript=/path/to/myscript
(это находится в вашем файле инициализации оболочки, вероятно, .bashrc
дляbash
).
В псевдониме необходимо указать полный абсолютный путь к исполняемому файлу.
Моя первоначальная проблема получила правильное решение, предложенное @muru, однако, возможно, какое-либо использование C
утилиты для цитирования. Я сейчас написал (в моей системе была команда quote
, но она цитировала только 1-й аргумент, игнорируя остальные ), как обычно, используйте gcc quoteit.c -o quoteit && chmod +x quoteit
для сборки предоставленного кода в quoteit.c в текущей папке:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main(int argc, char *argv[])
{
if (argc ==2 && (!strcmp(argv[1],"-h") || !strcmp(argv[1],"--help")))
{
printf("The program surrounds set of arguments with double quotes\n");
printf("Example: quoteit 12 23 outputs \"12 23\"\n");
return 0;
}
//printf("%d\n", argc);
printf("\"");
for (int i=1; i< argc; i++)
{
printf("%s", argv[i]);
if (u<args-1) printf(" ");
}
printf("\"");
return 0;
}
Я не понимаю, как это может помочь с вашей другой проблемой, но если вам действительно нужна команда, которая печатает свои аргументы, разделенные пробелом, и все это окружено "
и завершается символом новой строки, вы мог бы сделать это с помощьюawk
:
awk -- '
BEGIN{
printf "\""
for (i = 1; i < ARGC; i++) printf "%s", (i == 1 ? "" : " ") ARGV[i]
print "\""
}' arg1 "arg 2" 'arg 3' 'arg "4"'
отпечатки:
"arg1 arg 2 arg 3 arg "4""
Это можно сделать с помощью простого сценария Bash:
#!/bin/bash
echo "\"$*\""
Уже $*
сгенерирован полный список аргументов. echo
просто окружает их экранированными кавычками.
myquote.sh hi, 'how do' you "do?"
"hi, how do you do?"
Теперь, относится к предполагаемому использованию этого скрипта 'quoter' для помещения в кавычки имен файлов, полученных с помощью find
в его предложении exec
, в этом нет необходимости, потому что вы можете добавить кавычки прямо в аргумент фигурных скобок, как в этом примере, чтобы он был правильно принят командой grep
:
find /etc -exec grep -Hi "{}" \;
или, в случае конвейера к xargs
, используя предложение -print0
, чтобы пометить имена файлов разделителем NULL для команды xargs
, следующей в конвейере.