Исполняемый файл с именем 'test' находится в $ PATH, но не запускается

С GNU date :

d=1456478048306
s=${d%???}
ms=${d#"$s"}

date -d "@$s" +"%F %T.$ms %z"
# or:
date -d "$s.$ms" '+%F %T.%3N %z'

С BSD date :

date -r "$s" +"%F %T.$ms %z"

С GNU awk и последние версии mawk (начиная с 1.3.4 20121129 ):

echo 1456478048306 | awk '{
  print strftime("%F %T." substr($0,length-2) " %z", substr($0, 1, length-3))}'

Для переносимости, perl может быть вашим лучшим выбором:

echo 1456478048306 | perl -MPOSIX -lne '
  print strftime "%F %T.$2 %z", localtime $1 if /(.+)(.{3})/'

Здесь указывается я предпочитаю более традиционный и менее двусмысленный формат:

2016-02-26 09:14:08.306 +0000

, но, конечно, вы можете настроить формат strftime по своему усмотрению.

13
06.02.2019, 03:35
1 ответ

test неудачное имя для использования, это стандартная утилита для условных тестов . (На самом деле это та же самая команда, что и [в if [... ], просто выглядит как синтаксическая вещь, но на самом деле это обычная команда.)

testтакже встроен, например. Bash, поэтому запуск только testникогда не ищет ваш двоичный файл по пути.

bash$ help test | head
test: test [expr]
    Evaluate conditional expression.

    Exits with a status of 0 (true) or 1 (false) depending on
    the evaluation of EXPR.  Expressions may be unary or binary.  
    [...]

testбез аргументов просто возвращает 1 (false ).

Запуск strace testне включает встроенную оболочку, поскольку straceне реализует никаких утилит. Он просто использует то, что находит в вашем PATH. Обратите внимание, что у вас, вероятно, есть стандартный testв /bin/testили /usr/bin/test, поэтому, если это будет первым в PATH, straceзапустит это.

В моем Bash whichтакже является внешней командой, поэтому она также не имеет понятия о встроенных функциях. С другой стороны, команда typeвстроена в оболочку, и type testпокажет, что test is a shell builtin.

См. также:Почему бы не использовать «который»? Что тогда использовать?

45
27.01.2020, 19:52

Теги

Похожие вопросы