Установка rlwrap
и выполненный rlwrap php5
. Rlwrap является универсальной readline оберткой, он обеспечивает выпуск командной строки и историю для любого read-eval-print цикла. Так как это - универсальная обертка, Вы не получите PHP-определенного завершения.
С другой стороны, получите исходный пакет и восстановите его с поддержкой readline. Поддержка Readline была только не учтена из-за лицензирования проблем, но эти проблемы только запрещают распределению PHP5, связанный с readline, они не запрещают Вам использование его.
apt-get source php5-cli
apt-get install build-essential fakeroot
apt-get build-dep php5-cli
cd php5-*/
# Edit debian/rules to configure with readline support
# Add an entry to debian/changelog to remember what you did
dpkg-buildpackage -rfakeroot -us -uc -b -nc
Это довольно обычно, некоторые программы основывают свою работу исключительно над этим.
Некоторые более типичные примеры, которые приходят на ум, su
, sudo
и xterm
.
su -c 'ls -l /root'
sudo ls -l root
xterm -e 'top -d 10'
Это отличается от Вашего примера
echo `echo hello`
где обратные кавычки интерпретируются оболочкой, и программа ничего не выполняет самого.
Отметьте также различие между su
и sudo
. Первое взятие строка, и могла быть трудной настроить такую строку с пользовательской точки зрения, например, развернуть переменную, прежде чем это будет замечено командой; второе серия строки и намного более проста (нет никаких кавычек в sudo
пример).
Что они используют для реализации их внутренней работы? Существует по существу два пути: system
библиотечная подпрограмма и exec
системный вызов. Первое будет называть оболочку и допускать различные расширения оболочки, как
su -c 'ls -ld /root/.*'
в то время как второй метод не позволяет такую свободу.
Обратные галочки удерживаются от использования, потому что они едва nestable, и не легко отличенные в различных шрифтах от apostrophs.
Вместо этого используйте $ (cmd), который тривиален:
echo $(echo $(echo $(echo $(echo $(echo hello)))))
И да, это - функция, которая часто требуется, даже если это редко используется.
Но программы, которые обрабатывают команды, но не обязательно вызывают себя снова, являются легионом:
bash, dash, zsh
конечно,scala, haskell, ruby, python, lua, perl, php, ...
bc, r, ...
psql -c "SELECT foo FROM bar" sampledb
ssh, telnet, ...
Самый превосходный текстовый редактор Vim, и это - предшественник, vi, имейте эту функцию:
Введите!) дата, когда Ваш курсор находится на пустой строке и выводе date
команда будет помещена в пустую строку.
Я использую ту небольшую последовательность при добавлении к файлам, полным примечаний или списков задач так, чтобы я добавил метку времени к записям.
Снова в Vim, Вы могли поместить свой курсор на первую строку абзаца текста, совершить нападки V, использовать j для потери работоспособности по строке за один раз к последней строке абзаца. Хит! fmt и получают Ваше в текстовом формате в строки меньше чем на 80 столбцов. Vim действительно выделяет маркировку, но вариант был общим приемом на более старом vi, который просто имел метки: b! fmt
Относительно Вас больше технических вопросов, это может быть сделано несколько путей. Стандартный вызов библиотеки C system(3)
распространенный способ состоит в том, чтобы выполнить внешнего афериста. Тот стандартный вызов библиотеки может наложить слишком много предположений для того, что Вы хотите сделать, в этом случае, Вы использовали бы fork(2)
системный вызов для получения нового процесса, который изменил бы дескрипторы файлов или другие вещи, и затем звонил бы execve(2)
системный вызов, чтобы заставить ядро загружать другой исполняемый файл в адресное пространство нового процесса.
Это - относительно общая вещь для программы командной строки, чтобы сделать, потому что это предоставляет такое большое повторное использование других команд.