Почему эта подсказка удара действует странно/исчезновение, и как я фиксирую ее (OS X)?

Проблема в том, что ваш первый аргумент - «4444». Почему?

Посмотрите на эту строку:

execlp("/usr/bin/netcat", "127.0.0.1", "4444", 0);

Первый аргумент для execlp() - это исполняемый двоичный файл. Остальные аргументы будут формировать argv[] -вектор, передаваемый процессу.

По соглашению, argv[0] должно содержать имя исполняемого файла, и первый «реальный» аргумент - argv[1], который в вашем случае - «4444». То, что вы делаете, является эквивалентом оболочки

netcat 4444

, и правильный вызов будет:

execlp("/usr/bin/netcat", "netcat", "127.0.0.1", "4444", 0);

Btw. использование execlp() имеет смысл только при вызове двоичного файла без полного пути, поскольку он ищет сам правильный путь (используя переменную окружения PATH). В противном случае следует использовать execl(). Но это все равно будет работать.

11
задан David Smith 1 April 2009 в 18:13
поделиться

3 ответа

Это кажется, что это должно решить Вашу проблему.

Это, кажется, работает на меня*:

export PS1='--(\[\e[$((32-${?}))m\]\u\[\e[0m\])-(\[\e[$((32-${?}))m\]\d\[\e[0m\]|\[\e[$((32-${?}))m\]\T\[\e[0m\])--(\[\e[$((32-${?}))m\]\w\[\e[0m\] \$ '

* хорошо, действительно export PS1='\u@\h:\w\$ ' работы для меня

Чтобы процитировать связанное сообщение, ответ заключается в добавлении \[и \] вокруг всех Ваших цветных последовательностей в Вашем объявлении PS1:

Прежде чем у меня было следующее значение для PS1:

'\e [0; 34m\h:\w [!] \$\\e [0m'

который дал мне хорошую синюю подсказку следующей формы

hostname:working-каталог [число команды] $

Однако у меня была та же переносящая строку проблема, которую Вы сделали. Фиксация должна была вставить \[и \] вокруг Escape ANSI так, чтобы оболочка знала для не включения их в вычисление обертывания строки. Это приводит к следующему значению для PS1:

'\[\e [0; 34 м \]\h:\w [!] \$\\[\e [m \]'

35
ответ дан 3 December 2019 в 01:21
поделиться

http://mywiki.wooledge.org/BashFAQ/053 - Я имею необычную подсказку с цветами и теперь колочу, кажется, не знает, насколько широкий мой терминал. Строки повторяются неправильно.

Между прочим; для Вашей ссылки; вот мой PS1 который похож на это: alt text
(источник: lyndir.com)

\[$reset$bold$green\]\u@\h\[$blue\] \W \[$red\]${?/#0/\[$green\]}\$\[$reset\]

Заметьте, как я вставил все цветовые коды $parameters сделать это более опрятным, но что еще более важно, потому что необходимо использовать tput генерировать их. См.:

http://mywiki.wooledge.org/BashFAQ/037 - Как я могу распечатать текст в различных цветах?

Я объявляю свои цветные параметры в служебном сценарии, который получен моим ~/.bashrc (и любые сценарии, которые я пишу), который называют bashlib.

На заключительной ноте; поместите Ваш PS1 определение в ~/.bashrc и не делайте export это. Нет абсолютно никакой причины, почему необходимо добавить Ваш PS1 определение среде любого и всех процессов Вы мечете икру от своей оболочки.

6
ответ дан 3 December 2019 в 01:21
поделиться

Вы просто, кажется, пропускаете запуск и закрывающие скобки вокруг Ваших Escape (перед первым '\e' и после последнего 'm'):

PS1='--(\[\e[$((32-${?}))m\u\e[0m)-(\e[$((32-${?}))m\d\e[0m|\e[$((32-${?}))m\T\e[0m)--(\e[$((32-${?}))m\w\e[0m\] \$ '

Как упомянуто, PS1 var не должен быть экспортирован: только Ваша оболочка должна видеть его.

1
ответ дан 3 December 2019 в 01:21
поделиться