Измените текущий каталог из сценария Bash

Используйте replace , примененные только для отфильтрованных значений по mask :

df['keyword_2'] = df['keyword'].mask(df['keyword'] != 'transfer', 
                                     df['keyword'].str.replace('transfer', '').str.strip())
print (df)
   id        keyword keyword_2
0   1       transfer  transfer
1   2   atm transfer       atm
2   3            atm       atm
3   4  ulta transfer      ulta

Другое решение без полоски, но с join и split:

print (df)
   id          keyword
0   1         transfer
1   2     atm transfer
2   3              atm
3   4  ulta transfer v

df['keyword_2'] = [' '.join(y for y in x.split() if y != 'transfer') 
                         if x != 'transfer' else x for x in df['keyword']]

print (df)
   id          keyword keyword_2
0   1         transfer  transfer
1   2     atm transfer       atm
2   3              atm       atm
3   4  ulta transfer v    ulta v

175
задан Mateusz Piotrowski 11 January 2018 в 19:19
поделиться

6 ответов

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

#!/bin/bash
#
# this script should not be run directly,
# instead you need to source it from your .bashrc,
# by adding this line:
#   . ~/bin/myprog.sh
#

function myprog() {
  A=$1
  B=$2
  echo "aaa ${A} bbb ${B} ccc"
  cd /proc
}

Причина в том, что каждый процесс имеет свой собственный текущий каталог, и когда вы выполняете программу из оболочки, она запускается в новый процесс. Стандартные «cd», «pushd» и «popd» встроены в интерпретатор оболочки, так что они влияют на процесс оболочки.

Делая свою программу функцией оболочки, вы добавляете свою собственную команду внутри процесса, а затем любую изменение каталога отражается в процессе оболочки.

164
ответ дан 23 November 2019 в 20:24
поделиться

С помощью pushd текущий каталог помещается в стек каталогов и изменяется на данный каталог, popd получает каталог поверх стек, а затем изменяет его.

pushd ../new/dir > /dev/null
# do something in ../new/dir
popd > /dev/null
13
ответ дан 23 November 2019 в 20:24
поделиться

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

Вместо этого, вы можете запустить свой скрипт так:

. myscript.sh

The . будет оценивать сценарий в текущей среде, поэтому он может быть изменен

203
ответ дан 23 November 2019 в 20:24
поделиться

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

  1. добавить этот скрипт в ПУТЬ
  2. запустить скрипт как ]. имя сценария

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

53
ответ дан 23 November 2019 в 20:24
поделиться

Если вы используете bash, вы можете попробовать alias:

в файле .bashrc добавить эту строку:

alias p='cd /home/serdar/my_new_folder/path/'

когда вы напишете «p» в командной строке, каталог изменится.

31
ответ дан 23 November 2019 в 20:24
поделиться

Объединив все вышесказанное, вы можете создать псевдоним

alias your_cmd=". your_cmd"

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

38
ответ дан 23 November 2019 в 20:24
поделиться
Другие вопросы по тегам:

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