As you said, when the bat's collider hits the grass collider, it would throw an error, because
You see on your bat script:
knockback = area.knockback_vector * 120
The area in that instance would be the grass's collider. The area entered function of your bat calls knockback_vector, where it doesn't exist in your grass's script.
var Grasscut = load("res://World/Grasscut.tscn")
var grasscut = Grasscut.instance()
var world = get_tree().current_scene
grasscut.global_position = global_position
It works fine when the sword hit box's area collider hits the bat simply because knockback_vector exists in the swords hit box's script:
var knockback_vector = Vector2.ZERO
There are several ways to fix this, first would be to separate the hurtbox of your sword and bat in to their own layer. Say we have the following layers:
you could put your grass on the 1st Layer, and remove it from the any Mask Layer.
Layer 1(world): : Grass
This means that the grass is on layer 1 and it's not looking in any other Layer(Masks)
Of course, assuming your Grass can be destroyed or attacked. Then if your grass has a HurtBox, you put it in to:
Layer 5(enemyHurtBox): GrassHurtBox
And remove the Grass HurtBox, from any other Masks or Layers.
Then on your bat's HURTBOX mask and layers.
Layer 5(enemyHurtBox): BatHurtBox
This means that the Bat's hurtbox(not the bat itself-assuming the bat and it's hurtbox is separate nodes) layer is only on the Layer 5(enemyHurtBox) only. this should ignore any other colliders not in those mask layer
Then you put the sword hitbox mask/layer into
Mask 5(enemyHurtBox): Sword HitBox
Which means, the playerHitBox will only look for objects/colliders in the Layer 5(Mask: Enemy). And it won't need to appear in any other layer, because the sword hit box only purpose is to interact with enemyHurtBox colliders or colliders found in that Layer, including the grass.
TDLR: Make's sure your Grass HurtBox and Bat HurtBax, should not have any MASK layer turned on and should only be on their Hurt Layer.