Почему команда "ls *" выдает ошибку о недопустимых параметрах?

Вы можете использовать команду swap-pane. По умолчанию это привязано к C-b {и C-b }, предполагая, что C-bявляется вашим префиксом tmux.

В вашем конкретном случае вы можете сфокусироваться на панели 1и выполнить C-b }дважды. Затем вы фокусируетесь на панели 3и делаете C-b {один раз.

Есть много способов добиться этого, вы также можете использовать C-b C-o, независимо от того, где находится ваш фокус, а затем сфокусироваться на панели 3и выполнить C-b {.

Если вам приходится делать это часто, вы можете сделать ярлык в своем ~/.tmux.conf.

Обратите внимание, что ни одна из этих команд не сохраняет размер ваших панелей. Если левая панель раньше была больше двух других, это все равно останется после перемещения панелей. Это означает, что панель 1станет меньше, а панель 3— больше. Я не знаю, возможно ли сохранить размеры панели.

33
28.10.2019, 03:35
4 ответа

Когда вы бежите

ls *

подстановка действует как обычно, и *заменяется на все имена файлов в текущем каталоге --, включая этот:

-|h4k3r|-

Это начинается с -, поэтому lsпытается проанализировать его как вариант (, например -aили-l). Поскольку |на самом деле не является параметром, распознаваемым ls, он выдает сообщение об ошибке invalid option, а затем завершает работу (без вывода списка файлов ).

Если вы хотите явным образом перечислить все содержимое текущей папки, вместо этого попробуйте

ls./*

...который будет ставить префикс./(ко всем именам файлов, чтобы запись не была неверно истолкована как опция ),или

ls -- *

...где --- "разделитель, указывающий конец опций", т.е. любые оставшиеся аргументы являются именами файлов.

104
27.01.2020, 19:37

Я думаю, что важный недостающий концептуальный скачок здесь заключается в том, где делается подстановка. lsникогда не будет выполнять подстановку. Если вы не укажете ему никаких аргументов, он предполагает, что вы имели в виду ., и перечисляет этот каталог, как и любой другой каталог, который вы указали в командной строке.

Подстановку выполняет оболочка. Затем оболочка передает результаты в виде набора аргументов командной строки в ls. lsпонятия не имеет, ввели ли вы эти аргументы или они являются результатом расширения глобуса. И поэтому он анализирует их на наличие флагов, как и любые другие аргументы командной строки.

Это не так, как это работает в Windows, что, я думаю, является серьезным недостатком в том, как Windows обрабатывает программы командной строки.

Еще одна интересная демонстрация здесь — создать каталог, содержащий несколько каталогов. Если вы затем выполните там ls *, оболочка предоставит все эти каталоги в качестве аргументов, а lsвыдаст вам список для каждого из них. Это просто показывает, что предположение ., если вы не предоставили аргумент, является простым значением по умолчанию, а не каким-либо особым поведением.

Если вы скажете ./*вместо *, оболочка выполнит подстановку глобуса, в результате чего все будет иметь перед собой ./, поэтому lsне будет интерпретировать ни один из аргументов как параметры. Если вы сделаете ls -- *, lsинтерпретирует параметр --как означающий, что он должен прекратить попытки обработки параметров и рассматривать все остальные аргументы как файлы или каталоги, для которых он должен предоставить список. Так что, ИМХО, --- лучший выбор.

Соглашение --соблюдается подавляющим большинством утилит командной строки Unix и является стандартной функцией большинства библиотек синтаксического анализа аргументов, написанных для большинства языков.

4
27.01.2020, 19:37

Как правило, команда ls *должна вывести список всех файлов и каталогов в вашем текущем рабочем каталоге. Есть 2 случая, которые могут привести к проблеме, с которой вы столкнулись.

  1. Если какой-либо из файлов, содержащихся в Каталоге, содержит неподдерживаемые символы, например, каталог с именем --2или -2, приведет к такой ошибке. Например:

    # ls -la | grep 2$
    drwxrwxr-x  2 test test    4096 Oct 28 14:58 --2
    # ls *
    ls: unrecognized option '--2'
    

    Это связано с тем, что имя файла, начинающееся с -, будет рассматриваться как опция команды ls.

  2. Если это не так, я полагаю, что в вашем файле .bashrcможет быть установлен какой-то псевдоним. Например, если я установлю псевдоним alias ls='ls –2', я не смогу использовать команду ls, так как она вызовет недопустимую опцию -2.

0
27.01.2020, 19:37

Это означает, что у вас есть файл с именем ' -|'. Из-за того, как работает оболочка (bash, ksh,... ), все выражения с подстановочными знаками оцениваются относительно того, что находится в вашем текущем каталоге до вызова команды, поэтому, если у вас есть файл с именем-| , тогда ls *будет вызываться как ls file1 file2... -|..., и вы получите эту ошибку.

Что касается того, как удалить или переименовать его -, вы можете использовать mv './-|' xyz, чтобы переименовать его, например, в xyz.

-2
27.01.2020, 19:37

Теги

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