Отключить bash, распространяя * на все имена файлов при вводе * в качестве параметра? [Дубликат]

Попробовав решение, предложенное Желязным на относительно большом DataFrame (~ 400 тыс. строк), я нашел его очень медленным. Вот альтернатива, которую я обнаружил, чтобы быстрее выполнять заказы на моем наборе данных.

df = pd.DataFrame({
    'sp' : ['MM1', 'MM1', 'MM1', 'MM2', 'MM2', 'MM2', 'MM4', 'MM4', 'MM4'],
    'mt' : ['S1', 'S1', 'S3', 'S3', 'S4', 'S4', 'S2', 'S2', 'S2'],
    'val' : ['a', 'n', 'cb', 'mk', 'bg', 'dgb', 'rd', 'cb', 'uyi'],
    'count' : [3,2,5,8,10,1,2,2,7]
    })

df_grouped = df.groupby(['sp', 'mt']).agg({'count':'max'})

df_grouped = df_grouped.reset_index()

df_grouped = df_grouped.rename(columns={'count':'count_max'})

df = pd.merge(df, df_grouped, how='left', on=['sp', 'mt'])

df = df[df['count'] == df['count_max']]
49
задан hotpaw2 12 July 2012 в 17:30
поделиться

5 ответов

Нет. Расширение происходит до того, как команда будет запущена. Вы можете только отключить glob перед запуском команды или путем цитирования звезды.

$ # quote it
$ foo '*'

$ # or escape it
$ foo \*

$ # or disable the glob (noglob)
$ set -f
$ foo *
78
ответ дан codeforester 22 August 2018 в 10:44
поделиться
  • 1
    также, если нечего расширять, нет расширения. т. е. с пустым pwd, echo * является просто * – sam boosalis 1 April 2014 в 00:48
  • 2
    @sam Это зависит от того, как ваши параметры установлены. Из tldp: "Если имена подходящих файлов не найдены, а опция оболочки nullglob отключена, слово остается неизменным. Если параметр nullglob установлен, и совпадений не найдено, слово удаляется. & Quot; – Chris Middleton 6 February 2015 в 19:05
  • 3
    спасибо, я должен был квалифицировать, что это было только от наблюдения, а не от какого-либо понимания. – sam boosalis 6 February 2015 в 22:31

Остерегайтесь: если нет имен, соответствующих маске, bash передает аргумент as-is без расширения!

Proof (pa.py - очень простой скрипт, который просто печатает свои аргументы):

 $ ls
f1.cc  f2.cc  pa.py
 $ ./pa.py *.cc
['./pa.py', 'f1.cc', 'f2.cc']
 $ ./pa.py *.cpp
['./pa.py', '*.cpp']
1
ответ дан A-B-B 22 August 2018 в 10:44
поделиться
  • 1
    Не всегда. set -o nullglob или shopt -s failglob, и это поведение изменится (двумя разными способами). – Charles Duffy 1 December 2015 в 01:22

Расширение выполняется оболочкой перед запуском вашей программы. Ваша программа не имеет понятия, произошло ли расширение или нет.

   set -o noglob

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

Альтернатива процитировать ваши аргументы, например

foo "*"
7
ответ дан Brian Agnew 22 August 2018 в 10:44
поделиться

Хотя верно, что сама команда не может отключить глобус, пользователь может сказать оболочке Unix, чтобы не глотать определенную команду. Обычно это делается путем редактирования файлов конфигурации оболочки. Предполагая, что команда foo может быть найдена по пути к команде, в соответствующий файл конфигурации необходимо добавить следующее:

Для оболочек sh, bash и ksh:

alias foo='set -f;foo';foo(){ command foo "$@";set +f;}

Для оболочек csh и tcsh:

alias foo 'set noglob;\foo \!*;unset noglob'

Для оболочки zsh:

alias foo='noglob foo'

Путь к командной строке не нужно использовать. Скажем, команда foo хранится в каталоге ~ / bin, а затем следующее:

Для оболочек sh, bash и ksh:

alias foo='set -f;foo';foo(){ ~/bin/foo "$@";set +f;}

Для csh и tcsh shells:

alias foo 'set noglob;$home/bin/foo \!*;unset noglob'

Для оболочки zsh:

alias foo='noglob ~/bin/foo'

Все вышеперечисленное было протестировано с использованием OSX 10.9.2 от Apple. Примечание. При копировании вышеуказанного кода будьте осторожны при удалении любых пробелов. Они могут быть значительными.

Обновление:

Пользователь geira указал, что в случае оболочки bash

alias foo='set -f;foo';foo(){ ~/bin/foo "$@";set +f;}

можно заменить на

reset_expansion(){ CMD="$1";shift;$CMD "$@";set +f;}
alias foo='set -f;reset_expansion ~/bin/foo'

, что устраняет необходимость в функции foo.

Некоторые веб-сайты, используемые для создания этого документа:

39
ответ дан Community 22 August 2018 в 10:44
поделиться
  • 1
    Это должен был быть принятый ответ, поскольку он доказывает, что действительно возможно сделать то, что хочет OP. Для некоторых более совершенных методов в bash эта ссылка документирует различные варианты: blog.edwards-research.com/2011/05/preventing-globbing – geira 23 April 2015 в 08:40
  • 2
    @geira: Иногда ответ принимается до того, как будет опубликован лучший ответ. Я считаю, что это может быть один из таких случаев. Я также считаю, что ответ отмечает, как большинство полезных пользователей заканчивается первым. Примечание. Я добавил свой вклад в свой ответ. – David Anderson 27 April 2015 в 14:11
  • 3
    @geira, OP хочет, чтобы скомпилированная программа связывалась с оболочкой; ответ на то, что можно настроить оболочку, чтобы вести себя по желанию по командной строке, является полезным ответом, и я сам соглашусь с этим, но я вижу, что можно не согласиться с тем, полностью ли он включен. – Charles Duffy 1 December 2015 в 01:24
  • 4
    Тот факт, что он может быть выполнен, не означает, что он должен быть выполнен. При изменении поведения оболочки от разумного ожидания пользователя для выбранных команд звучит удивительно и в конечном итоге нежелательно. – tripleee 29 July 2016 в 05:36
  • 5
    @ tripiple: Было время, когда люди ожидали реле и вакуумные трубки. Ожидались отверстия, пробитые картонными карточками и бумажной лентой. Люди придерживались правил слайдов, а не калькуляторов и телефонов. Полагаю, для вас это было бы желательно. В те времена мне было все равно. Мне нравится видеть, что будет дальше. – David Anderson 29 July 2016 в 11:31

Нет. Оболочка типа Bourne всегда выполняет globbing , когда это необходимо, перед выполнением команды. Пользователь должен указывать или избегать аргументов, чтобы предотвратить глобус, например foo \*; фактическая выполняемая программа не может указывать предпочтения.

0
ответ дан mrb 22 August 2018 в 10:44
поделиться
  • 1
    Также у этой оболочки есть стиль Bourne. Это не setopt, но set -o noglob. – Anne van Rossum 4 December 2013 в 14:57