Другой недостаток, с которым я столкнулся, находится на, Формы аутентифицировали веб-сайт с помощью пользовательского IPrincipal
/ IIdentity
. Cassini переключится AppDomains
, не предупреждая (или уведомление).
Проверка этот сообщение в блоге для больше. Головная боль на этом заставила меня отбросить Cassini и придерживаться IIS.
Мне всегда нравится perl -ne 'chomp and print'
, для обрезки новой строки. Красиво и легко запоминается.
например ls -l | perl -ne 'chomp and print'
Однако
Я не думаю, что это ваша проблема. Хотя я не уверен, что понимаю, как вы передаете команды из файла в «чтение» в вашем сценарии оболочки.
С моим собственным тестовым сценарием, подобным этому (test.sh)
read line
if [ -n "$line" ]; then
$line
fi
и пример входного файла, подобного этому (test.cmds)
ls
ls -l
ls -ltra
Если я запустил его так ./ test.sh
Возможно, в вашем входном файле есть дополнительные непечатаемые символы?
мой выглядит так
od -c test.cmds
0000000 l s \n l s - l \n l s - l t
0000020 r a \n
0000023
Из ваших комментариев ниже, Я подозреваю, что в вашем входном файле может быть возврат каретки ("\ r"), что не то же самое, что перевод строки. Входной файл изначально имеет формат DOS? Если это так, то вам нужно преобразовать 2-байтовую строку DOS, заканчивающуюся "\ r \ n", в однобайтовую строку UNIX, "\ n", чтобы достичь ожидаемых результатов.
Вы сможете сделать это, заменив "\ n" вместо "\ r" в любой из закомментированных строк.
Кто-то уже написал программу, которая выполняет команды оболочки: sh file
Если вы действительно хотите выполнить только первую строку файла: head -n 1 file | sh
Если ваша проблема связана с возвратом каретки: tr -d '\ r'
Я пробовал это:
read line
echo -n $line | od -x
Для ввода «xxxx» я получаю:
0000000 7878 7878
Как видите, в конце строки нет \ n
содержимое переменной. Я предлагаю запустить скрипт с опцией -x
( bash -x script
). Это напечатает все команды по мере их выполнения.
[EDIT] Ваша проблема в том, что вы редактировали файл commands.txt в Windows. Теперь файл содержит CRLF (0d0a) в качестве разделителей строк, что сбивает с толку чтение
(а ls \ r
- неизвестная команда). Используйте dos2unix
или аналогичный, чтобы превратить его в файл Unix.
Вы также можете попробовать заменить символы возврата каретки символами новой строки только с помощью встроенных команд Bash:
line=$'a line\r'
line="${line//$'\r'/$'\n'}"
#line="${line/%$'\r'/$'\n'}" # replace only at line end
printf "%s" "$line" | ruby -0777 -n -e 'p $_.to_s'
вам нужна команда eval
#!/bin/bash -x
while read cmd
do
if [ "$cmd" ]
then
eval "$cmd"
fi
done
Я запускал ее как И файл file.txt был:
./script.sh
ls
ls -l
ls -ltra
ps as
хотя и не работает для ls
, я рекомендую взглянуть на find
-print0
параметр
Следующий скрипт работает (по крайней мере, для меня):
#!/bin/bash
while read I ; do if [ "$I" ] ; then $I ; fi ; done ;